#include<queue>#include<cstdio>#include<string>#include<cstring>#include<iostream>#include<algorithm>#define INF 0x3f3f3f3f#define MAX 1010usingnamespace std;int S[MAX];/*!!堆排序(S从0开始存储)!!*/voidPerDown(int p,int N)//P为父节点的位置 {int Parent, Child;int X = S[p];//X为父节点值 //左儿子小于N时执行,数组从0开始for(Parent = p; Parent*2+1< N; Parent = Child)//循环的目的是如果一个父节点小于子节点,和子节点换位后,需要继续和新的孩子节点比较 {
Child = Parent*2+1;//注意S从0开始储存,所以这里的Child为Parent的左孩子 if(Child != N -1&& S[Child]< S[Child +1])
Child++;//比较左右孩子,Child指向左右孩子中较大的 if(X >= S[Child])break;//如果父节点的值大于左右孩子中较大的值,则退出循环 else S[Parent]= S[Child];//否则换位 }
S[Parent]= X;}voidHeapSort(int N){//将S调整为最大堆for(int i = N/2-1; i >=0; i--)//遍历父母结点 PerDown(i, N);for(int i = N -1; i >0; i--){//将最大值换到最后swap(S[0], S[i]);//重新调整剩下的为最大堆,最后一个已排好忽略后面的PerDown(0, i);}}voidPrint(int N){for(int i =0; i < N; i++) cout<< S[i]<<" ";}intmain(){int N ;
cout<<"Please enter the number of the numbers:";
cin>>N;
cout<<"Please enter the numbers :";for(int i =0; i < N; i++) cin >> S[i];HeapSort(N);//进行堆排序 Print(N);//输出 return0;}