算法导论程序10--建堆(Python)

我们可以用自底向上的方法利用过程max-heapify把一个大小为n=A.length的数组A[0..n-1]转换为最大堆。子数组A(下取整n/2.....n-1)中的元素都是叶结点。每个叶结点都可以看成只包含一个元素的堆。过程build_max_heap(A)对树中的其他结点都调用一次max-heapify:

代码:

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
    def build_max_heap(self,A):
        N = math.floor(len(A)/2)-1
        for i in range(N,-1,-1):
            A = self.max_heapify(A,i)
        return A      
运行:

>>> A=[12,3,45,66,7,8,9,11,13]
>>> h=heapsort(A)
>>> A=h.build_max_heap(A)
>>> A
[66, 13, 45, 12, 7, 8, 9, 11, 3]








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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值