堆:完全二叉树
满足一定顺序
import random
list=list(i for i in range(0,99,8))
random.shuffle(list)
print(list)
#list=[9,50,30,15,14,12,17,13,2,7,10]
def xiangxiatiaozheng(low,fin,list):
#向下调整 fin=len(list)-1
i=low #根节点
j=2*i+1
tem=list[i]
while j<=fin:#左孩子存在
if j+1<=fin and list[j+1]>list[j]:
j=j+1
if list[j]>tem:
list[i]=list[j]
i=j
j=2*i+1
else:
break
list[i]=tem
def jiandui(list):#从下向上建堆
n=len(list)
for l in range((n-2)//2,-1,-1):
#最后根节点,如图第5位(2)为根节点
xiangxiatiaozheng(l,n-1,list)
def shuchu(list):#输出,0位最大值
jiandui(list)#先建堆
fin=len(list)
for w in range(fin-1,-1,-1):
#最后一位,不用新建列表节省空间,仅对无序区建堆
print('交换前',list)
list[0],list[w]=list[w],list[0]
print('交换后',list)
xiangxiatiaozheng(0,w-1,list)
print('向下调整',list)
shuchu(list)
print(list)
python内置模块
import random
import heapq
list=list(i for i in range(0,99,8))
random.shuffle(list)
print(list)
heapq.heapify(list)#建堆
n=len(list)
list2=[]
for i in range(n):#n次
a=heapq.heappop(list)#删除并返回最小值
list2.append(a)
print(list2)