def heap_sort(elems):
"""堆排序"""
def siftdown(elems, e, begin, end):
i, j = begin, begin * 2 + 1
while j < end:
if j + 1 < end and elems[j + 1] < elems[j]: # 找elems[j + 1]与elems[j]中较小的
j += 1
if e < elems[j]: # e在三者中最小,已找到了位置
break
elems[i] = elems[j] # elems[j]在三者中最小,上移
i, j = j, 2 * j + 1
elems[i] = e
end = len(elems)
# 建小顶堆
for i in range(end // 2, -1, -1):
siftdown(elems, elems[i], i, end)
for i in range((end - 1), 0, -1):
e = elems[i]
elems[i] = elems[0] # 取最小元素放到最后
siftdown(elems, e, 0, i) # 剩下元素再建小顶堆
e = [1, 3, 6, 4, 5]
heap_sort(e)
print(e) # [6, 5, 4, 3, 1]
e.reverse()
print(e) # [1, 3, 4, 5, 6]