【数据结构】堆的建立

大根堆调整实现

数组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);    
    }    
} 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值