上篇文章写了快速排序的代码;
本文写堆排序的代码
堆排序本身不难理解,重要的是重新排小根堆或者大根堆的过程
代码部分
'''_*_coding:utf-8_*_
author:zhangkai
time:2022
'''
def position_sort(listt,first,end): #传入数组和对应的左指针和右指针(小根堆)
head=first
tail=end
i=head #i指向堆顶元素
temp = listt[i] #保存堆顶元素
j=2*i+1 #j指向i的左孩子或右孩子结点
while j<=tail: #j小于等于最后一个叶子节点
if j+1<=tail:
if listt[j+1]<listt[j]: #右孩子小于左孩子时,右孩子上移
j=j+1
if listt[j]<listt[i]: #孩子节点小于根节点时,孩子节点上移,并且继续子树的遍历寻找
listt[i]=listt[j]
listt[j]=temp
i=j
j=2*i+1
else: #如果子节点都比父节点大了,下找终止,元素填入
listt[i]=temp
break
else:
listt[i]=temp #如果子节点都比父节点大,那只能把顶元素放在最后一个叶子结点
def heap_sort(lis,first,end):
i=first
n=end
index=i
for k in range((n-1)//2,-1,-1): #这里是要构建小根堆,从叶子结点开始,从子树到完全树(n-1)//2是最后一个叶子结点的父节点
position_sort(lis,k,n)
for j in range(n):
print("wei",lis)
lis[n-j],lis[0]=lis[0],lis[n-j] #把堆顶元素取出放到列表尾
print(lis)
position_sort(lis,0,n-j-1) #重新构建小根堆
#print(lis)
li=[5,8,1,6,9,0,4,7,2,3]
heap_sort(li,0,len(li)-1)
print(li)