#include <iostream> #include <time.h> using namespace std; void heapSort(int arr[],int len) { //在以0开始的数组里 //树中结点序号的关系是:if parent=p,then lchild=2p+1,rchild=2p+2 //if p is a child node,then its parent is (p-1)/2 // int last=len-1; //construct the heap for(int i=(last-1)/2;i>=0;i--) { int p=i; while(1) { //temp point to the max int temp=p; if(2*p+1<=last && arr[2*p+1]>arr[temp]) temp=2*p+1; if(2*p+2<=last && arr[2*p+2]>arr[temp]) temp=2*p+2; // if(temp==p) break; else { swap(arr[p],arr[temp]); p=temp; } } } //swap and ajust the heap for(int i=0;i<len-1;i++) { swap(arr[0],arr[last]); last--; int p=0; while(1) { //temp pointer to the max int temp=p; if(2*p+1<=last && arr[2*p+1]>arr[temp]) { temp=2*p+1; } if(2*p+2<=last && arr[2*p+2]>arr[temp]) { temp=2*p+2; } if(temp==p) break; else { swap(arr[p],arr[temp]); p=temp; } } } } int main() { srand((unsigned)time(0)); const int len=1000; int arr[len]; for(int i=0;i<len;i++) { arr[i]=rand()%1000; cout << arr[i] << ' '; } heapSort(arr,len); cout << endl; for(int i=0;i<len;i++) { cout << arr[i] << ' '; } return 0; }