1.在原数组的基础上改造成二叉堆,先从最下面一个父节点开始检查,使父节点总是大于他的两个子节点,根上为最大的数
2.根不断出堆,并放到最后把堆首(最大值)和堆尾互换,把堆的尺寸缩小1,并调用shift_down(0),目的是把新的数组顶端数据调整到相应位置,重复步骤,直到堆的尺寸为1
void PercDown(int a[],int i,int n){
int child,tmp;
for(tmp = a[i];2*i +1<n;i = child){
child = 2*i + 1; //becasue a[0] is root,so i's left child is 2*i + 1, right child is 2*i + 2
if(child!=n-1&&a[child]<a[child+1])
child++;
if(tmp<a[child])
a[i] = a[child];
else break;
}
a[i] = tmp;
}
void Heapsort(int a[],int n){
int i;
for(i = n/2;i>=0;i--)
PercDown(a,i,n);
for(i = n-1;i>=0;i--){
swamp(&a[0],&a[i]);
PercDown(a,0,i);
}
}
void swamp(int *a,int *b){
int tmp;
tmp = *a;
*a = *b;
*b = tmp;
}