算法导论程序9--维护堆的性质

微笑

函数max_heapify可以检测以下标i为根结点的子树是否是最大堆。

首先假定根结点为left(i)和right(i)的二叉树都是最大堆,但这时A[i]有可能小于其他孩子。这样就违背了最大堆的性质。max_heapify通过让A[i]的值在最大堆中“逐级下降”,从而使得以下标i为根结点的子树重新遵循最大堆的性质。

import math
class heapsort:
    def __init__(self,a_A):
        self.list=a_A
        self.heap_size = len(a_A)
    def parent(self,i):
        return math.floor((i-1)/2)
    def left(self,i):
        return 2*i+1
    def right(self,i):
        return 2*i+2
    def max_heapify(self,A,i):
        largest = i
        key = A[i]
        l = self.left(i)
        r = self.right(i)
        if l<len(A) and A[l] > A[largest]:
            largest = 2*i+1
        if r<len(A) and A[r] > A[largest]:
            largest = 2*i+2
        A[i]=A[largest]
        A[largest]=key
        if largest != i:
            self.max_heapify(A,largest)
        return A


运行结果:

>>> A=[16,4,10,14,7,9,3,2,8,1]
>>> p = heapsort(A)
>>> B= p.max_heapify(A,1)
>>> B
[16, 14, 10, 8, 7, 9, 3, 2, 4, 1]



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值