复习了堆,用C++写了一下,代码如下: #include<iostream> using namespace std; enum Flag{Max,Min}; //Max为最大堆,Min为最小堆 template<typename T> void exchange(T a,T b){ *a=*a+*b; *b=*a-*b; *a=*a-*b; } //保持堆性质 template<typename T> void keepHeap(T a[],int pos,int length,Flag f=Min){ //默认保持最小堆性质 if(length<=1) return; int j,k,h; h=pos; j=2*h+1; k=2*h+2; if(f==Min){ //先判断是否有左右子节点,有的话比较a[i]跟其左右子节点的大小,符合条件则替换 while(j<length||k<length){ if(j<length&&k<length){ if(a[j]<a[k]){ if(a[h]>a[j]){ exchange(&a[h],&a[j]); h=j; j=2*h+1; k=2*h+2; } //啥事都不做的时候记得退出 else break; }else{ //a[j]>=a[k] if(a[h]>a[k]){ exchange(&a[h],&a[k]); h=k; j=2*h+1; k=2*h+2; } //啥事都不做的时候记得退出 else break; } }else{ //j=length,k=length+1,a[k]不存在 if(a[h]>a[j]){ exchange(&a[h],&a[j]); break; }else{ //此处a[h]<=a[j],不需要交换,但是记得加上break以推出while break; } } } } else{ while(j<length||k<length){ if(j<length&&k<length){ if(a[j]>a[k]){ if(a[h]<a[j]){ exchange(&a[h],&a[j]); h=j; j=2*h+1; k=2*h+2; } //啥事都不做的时候记得退出 else break; }else{ //a[j]>=a[k] if(a[h]<a[k]){ exchange(&a[h],&a[k]); h=k; j=2*h+1; k=2*h+2; } //啥事都不做的时候记得退出 else break; } }else{ //j=length,k=length+1,a[k]不存在 if(a[h]<a[j]){ exchange(&a[h],&a[j]); break; }else{ //此处a[h]>=a[j],不需要交换,但是记得加上break以推出while break; } } } } } //建堆 template<typename T> void makeHeap(T a[],int length,Flag f=Min){ //默认生成最小堆 for(int i=(length-1)/2;i>=0;i--) keepHeap(a,i,length,f); } //堆排序 template<typename T> T* heapSort(T a[],int length,Flag f=Min){ T* tmp=new T[length]; for(int i=0;i<length;i++) tmp[i]=a[i]; T* result=new T[length]; makeHeap(tmp,length,f); for(int i=0;i<length;i++){ result[i]=tmp[0]; exchange(&tmp[0],&tmp[length-1-i]); keepHeap(tmp,0,length-(i+1),f); } return result; } 测试代码 #include "Heap.h" #include<iostream> using namespace std; int main(){ int a[]={72,73,71,23,94,16,05,68}; int *b,*c; cout<<"c(Min): *******************************"<<endl; c=heapSort(a,8,Min); for(int i=0;i<8;i++) cout<<c[i]<<" "; cout<<endl; cout<<"b(Max): *******************************"<<endl; b=heapSort(a,8,Max); for(int i=0;i<8;i++) cout<<b[i]<<" "; cout<<endl; cout<<"a(Original): ***************************"<<endl; for(int i=0;i<8;i++) cout<<a[i]<<" "; cout<<endl; system("PAUSE"); return 0; }