我们可以用自底向上的方法利用过程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]