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

来源:互联网 发布:网络电信诈骗防 编辑:程序博客网 时间:2024/06/07 01:17

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

代码:

import mathclass 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
原创粉丝点击