大根堆是升序
def keep_max_heap(h,n,root):
left=2*root+1#下标从0开始
right=2*root+2
maxnum=root
if left<n and h[left]>h[maxnum]:
maxnum=left
if right<n and h[right]>h[maxnum]:
maxnum=right
if maxnum!=root:
h[maxnum],h[root]=h[root],h[maxnum]
keep_max_heap(h,n,maxnum)
def heapSort(arr):
n = len(arr)
# 初始建大根堆 从最后一个非叶节点开始,向根节点调整
for i in range(n//2-1, -1, -1):
keep_max_heap(arr, n, i)
for i in range(n - 1, 0, -1):
# 将根的最大元素与最后一个元素交换 然后从根开始向下调整堆
arr[i], arr[0] = arr[0], arr[i]
# 后面是有序数组 前面是无序数组 只需调整前面未排序的数组 因此需要修改无序数组尾下标i
keep_max_heap(arr, i, 0)
#arr是整个数组 i是无序数组的结尾下标 0是跟下标
if __name__=='__main__':
a=[6,5,5,4,3,3,2,2,1]
heapSort(a)
print(a)
变成小根堆(降序),只需蓝色位置修改成下面符号即可