现在的位置: 首页 > 综合 > 正文

C++实现小根堆

2018年03月20日 ⁄ 综合 ⁄ 共 935字 ⁄ 字号 评论关闭

#include<iostream>
#include<vector>
using namespace std;
/*
*堆排序算法适用于海量元素,时间复杂度为O(nlog(n)),辅助空间也只需O(1);
*有大根堆和小根堆两种,大根堆根节点比两子节点大;小根堆相反。
*此例说明的是小根堆
*/
template <typename T>
void swap(const T &a ,const T &b){
 T t;
 t=a;
 a=b;
 b=t;
}
template <typename T>
void heapsort(vector<T> &arr,int n){
 int i,j,temp;
 T t;
 for(i=n/2;i>0;i--){//调整非叶节点
  t=arr[i];
  temp=i;
  for(j=2*temp;j<=n;j*=2){//满足二倍关系必须保证从1开始
   //if(arr[j]>arr[j+1])j++;//主要莫越界
   //!!遇到边界问题:最后一个节点没有兄弟的情况
   //改进如下
   if(j<n&&arr[j]>arr[j+1])j++;
   if(arr[temp]<=arr[j])break;
   arr[temp]=arr[j];
   temp=j;
  }
  arr[temp]=t;
 }
}
int main(int argc,char* rgv[]){
 int n,i,temp;
 cin>>n;
 vector<int> arr;
 arr.push_back(n);
 for(i=0;i<n;i++){
  cin>>temp;
  arr.push_back(temp);
 }
 heapsort<int>(arr,n);
 //此处要注意一个地方,heapsort<int>(arr,i-1);必须有i-1这个操作,每次arr[i]为剩余元素中最小的元素
 //如果固定为heapsort<int>(arr,n);无法得到正确的结果
 for(i=n;i>1;i--){
  swap(arr[1],arr[i]);
  heapsort<int>(arr,i-1);
 }
 for(i=1;i<=n;i++){
  cout<<arr[i]<<" ";
 }
 return 0;
}

//输出为倒序

抱歉!评论已关闭.