//================================== //堆排序 #include<iostream> using namespace std; #define LEFT(i) 2*i #define RIGHT(i) 2*i+1 #define PARENT(i) i/2 //使堆的第i个元素为符合最大堆元素 void Max_Heapify(int *a,int i,int len) { int l=LEFT(i),r=RIGHT(i),largest=i; if(l<=len && a[i-1]<a[l-1]) largest=l; if(r<=len && a[largest-1]<a[r-1]) largest=r; if(largest!=i) { int t=a[i-1]; a[i-1]=a[largest-1]; a[largest-1]=t; Max_Heapify(a,largest,len); } } //建立最大堆 void Build_Max_Heap(int *a,int len) { int i; for(i=len/2;i>0;i--) //叶子结点为 n/2+1(n/2即n/2的floor)一直到n //叶子不必理会 只需要考虑非叶子结点即可 Max_Heapify(a,i,len); } //堆排序 void Heap_Sort(int *a,int len) { Build_Max_Heap(a,len); int i=0,j=0; for(i=len;i>=2;i--) { //exchange the last one and the first one int t=a[0]; a[0]=a[len-1-j]; a[len-1-j]=t; j++; //the len of array must sub 1 Build_Max_Heap(a,i-1); } } #include <iostream> using namespace std; int main() { int i; int a[]={6,4,43,1,3,5,46,84,31,23,1,5,31,34,226,45,264,42,34,242,45}; int len=sizeof(a)/sizeof(int); cout<<len<<endl; Heap_Sort(a,len); for(i=0;i<len;i++) cout<<a[i]<<" "; return 0; } //==================================