思路:
- 构建好一个最大堆
- 根结点是最大的数,根结点和最后一个结点交换位置,然后对除了【0,n-1】个结点构造最大堆
- 根结点和第n-2个结点交换位置,然后对除了【0,n-2】个结点构造最大堆
- …
代码:
def heap(data,root):
if 2*root+1<len(data):
if 2*root+2<len(data) and data[2*root+2]>data[2*root+1]:
k=2*root+2
else:
k=2*root+1
if data[k]>data[root]:
data[root],data[k]=data[k],data[root]
heap(data,k)
def max_heap(data):
for i in range(len(data)//2-1,-1,-1):
heap(data,i)
return data
def heap_sort(data):
data=max_heap(data)
print(data)
li=[]
for i in range(len(data)-1,-1,-1):
li.append(data[0])
if i>0:
data[0],data[i]=data[i],data[0]
data=max_heap(data[:i])
print(data,'---------')
print(li)
if __name__ == '__main__':
data=[1,5,6,3,4,8,2,9,7]
heap_sort(data)