函数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]