def heapify(arr, n, i):
"""
arr:数组
n:数组的长度
i: 当前节点的索引
"""
r = 2*i + 1
l = 2*i
# 判断左子节点是否大于当前节点
if l < n and arr[l] > arr[i]:
largest = l
else:
largest = i
# 判断右子节点是否大于当前节点
if r < n and arr[r] > arr[largest]:
largest = r
# 不满足特性,交换节点位置,交换后再次进行heapify
if largest is not i:
arr[i], arr[largest] = arr[largest], arr[i]
heapify(arr, n, largest)
def build_max_heaps(arr, n):
i = n//2
while i >= 0:
heapify(arr, n, i)
i -= 1
def heapSort(arr):
n = len(arr)
build_max_heaps(arr, n)
for k in range(n-1, 0, -1):
arr[k], arr[0] = arr[0], arr[k]
heapify(arr, k, 0)
arr = [16, 14, 10, 8, 7, 9, 3, 2, 4, 1]
heapSort(arr)
n = len(arr)
print(arr)
'''
[1, 2, 3, 4, 7, 8, 9, 10, 14, 16]
'''
10-08
900
05-23
291
05-16
3862