堆维护

堆排序中,指的是最大堆排序,而最小堆是用于优先队列的。
最大堆排序:可以把堆看做是完全二叉树,不过其父节点的值大于自己点。一般使用数组来实现堆排序。堆维护就是通过算法使数组始终满足堆的条件。代码如下:

void Insert::MaxHeapIFY(int A[],int local,int total)//堆维护
{
    int total=14;//临时测试用的数组长度值
    int left_child=(local+1)*2-1;//因为是从0开始计数,所以计算公式有2i变为此公式
    //此处可以让A[0]为一个无穷大的值,这样就可以满足left = 2i,right = 2i+1int right_child=(local+1)*2;
    int largest=local;
    if(left_child<total && A[local] < A[left_child])
    {
        largest=left_child;
    }   
    if(right_child<total && A[largest] < A[right_child])
    {
        largest=right_child;
    }
    if(largest!=local)
    {
        int temp=A[local];
        A[local]=A[largest];
        A[largest]=temp;
        MaxHeapIFY(A,largest);
    }
}

其原理是:对于任意给定的一个节点,使他和其两个子节点相比较,把元素值大的放到父节点位置,如果调换了顺序,则要继续递归,看把原来父节点调换为子节点以后,该子节点是否满足堆的性质,如果不满足,就递归,知道满足以后,退出递归。其运行时间为:
T(n)<=T(2n/3)+O(1);
根据主方法可知,其时间复杂度为O(lgn);
备注:int total=sizeof(A)/sizeof(int);求不出元素的值,只能在主函数中得到。所以调用数组到函数中时,要将其长度一同传进去。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值