大根堆调整实现
数组A[1,2,3…,n] 数组下标是从1到n。
思路:
1、调整函数,比较找出lchild、rchild中最大者,和top位置元素交换(top最大则不交换)。然后对交换节点递归调整。
2、建立函数,从最后一个非叶子节点开始,向前循环,依次调用调整函数。
/*
* 大根堆调整
*/
void HeapAdjust(int *a, int top, int size){
int lchild = 2*top;
int rchild = 2*top + 1;
int max = top;
if (top <= size/2){ //top不是叶子节点
if (lchild < size && a[lchild] > a[max]){
max = lchild;
}
if (rchild < size && a[rchild] > a[max]){
max = rchild;
}
if (max != top){
swap(a[top], a[max]);
HeapAdjust(a, max, size);
}
}
}
建立函数
/*
* 建立堆
*/
void BuildHeap(int *a,int size)
{
int i;
for(i=size/2;i>=1;i--) //非叶节点最大序号值为size/2
{
HeapAdjust(a,i,size);
}
}