struct ArrayElem{
int key;
} *R;
//建堆:将第k个元素为根的树调整成大根堆
fixdown(ArrayElem *R, int k, int N)
{
while(2*k<N)
{
j = 2*k + 1;
if(j< N && R[j].key < R[j+1].key) j++;
if(R[k].key >= R[j].key) break;
swap(R[k],R[j]); k=j;
}
}
Heapsort(ArrayElem *R, int N)
{
for(int i=N/2; i>0; i--) fixdown(Array *R, i, N); //initial heap
for(i=N; i>1; i--){
exchange(R[i],R[0]);
fixdown(Array *R, 0, i-1);
}
}