#include<iostream>
using namespace std;
template<class T> //类型不限
void HeapAdjust(T A[], int a, int z){
for(int i=a,j=2*i; j<=z; i=j,j=2*i){ //i为父,j为子
if(j<z&&A[j+1]>A[j]) j++; //大顶堆,沿大孩子方向下行
if(A[i]<A[j])
swap(A[i],A[j]);
else
break;
}
}
template<class T>
void HeapSort(T A[], int n){
for(int i=n/2; i>=1;i--) //从倒数第一个非叶子结点,自下而上堆化
HeapAdjust(A, i, n);
for(i=n;i>1; i--){ //交换A[1]与最后元素A[i](i=n, ..., 1), 再堆化
swap(A[1], A[i]);
HeapAdjust(A, 1, i-1);
}
}
int main(){
int len = 5;
int A[] = {0, 9, 7, 5, 6, 4};
HeapSort(A, len);
for(int i=1;i<=len;i++)
cout<<A[i]<<' ';
cout<<endl;
return 0;
}
/*几点注意:
数组存储,第0号位置不用,因不满足二叉树中父子计算关系;
HeapAdjust功能单一独立,工作假定是除首元素外均满足堆定义;
调整自下而上,从最后一个非叶子(n/2)结点开始;
最后,在排序时, 首大元素每次与当前堆中最后一个元素交换保存,将堆缩小1,再堆化交换保存。
*/