def sift(li,low,head):
"""
:param li:你创建的列表
:param low:根节点位置
:param head:最后一个节点的位置
:return:
"""
i=low#堆顶元素
j=2*i+1# 堆顶的左孩子
tmp=li[low]#保存堆顶后面用
while j<=head:#判断堆是否排序完了
if j+1<=head and li[j+1]>li[j]:#判断左右子树的大小将j指向较大的那个
j=j+1
if li[j]>tmp:#如果孩子大于根
li[i]=li[j]#根等于这个孩子
i=j#将i下移
j=2*i+1#将j下移
else:#如果孩子不大于根
li[i]=tmp#就把这个根作为这个堆的根
break
else:#
li[i]=tmp
def heap_sort(li):#构建堆
n=len(li)#输入列表的长度
for i in range((n-2)//2,-1,-1):#找的最后一个元素父节点的位置并转换这么多次
sift(li,i,n-1)
for i in range(n-1,-1,-1):#输出堆顶元素
li[0],li[i]=li[i],li[0]
sift(li,0,i-1)#i—1是判断越界的条件这里将因为建堆和排序都是在一个序列进行的所以要改变越界条件
return li
li=[int(i) for i in input().split()]
heap_sort(li)
print(li)
视频详解链接:链接地址