铺垫一下:
首先聊下什么是“堆”,堆其实是一个“完全二叉树”,而且是一个有特殊规则的完全二叉树,可以分为“大顶堆”和“小顶堆”,大顶堆特点是根节点比其左右节点都要大,而小顶堆与其相反。
思路:
首先建立最大堆,然后依次交换根节点与最后一个元素,依次删除最后一个元素,重新建立最大堆。
注意:根节点是从0开始计数。
void swap(int *a,int *b)
{
int t=*a;
*a=*b;
*b=t;
}
void PercDown(int A[],int p,int N)
{//将N个结点以p为根节点的堆调整为最大堆;
//此时堆根节点从0开始计数;
int parent,child;
int X;
X=A[p];
for(parent=p;(parent*2+1)<N;parent=child)
{
child=parent*2+1;
if((child!=N-1)&&A[child]<A[child+1])
child++;
if(X>=A[child]) break;
else
A[parent]=A[child];
}
A[parent]=X;
}
void Heap_sort(int A[],int N)
{
int i;
for(i=N/2-1;i>=0;i--)
PercDown(A,i,N);
for(i=N-1;i>=0;i--)
{
swap(&A[0],&A[i]);
PercDown(A,0,i);
}
}