完全二叉树定义
若设二叉树的深度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层所有的结点都连续集中在最左边,这就是完全二叉树。
完全二叉树即堆的父节点子节点
设当前的为i,那么其父节点为:(i-1)/2 子节点为:2i+1、2i+2
堆的定义
- 堆中某个节点的值总是不大于或不小于其父节点的值;
- 堆总是一棵完全二叉树
堆的定义如下:n个元素的序列{k1,k2,ki,…,kn}当且仅当满足以下关系时,称之为堆。(ki >= k2i,ki >= k2i+1), (i = 1,2,3,4…n/2)
堆排序思想
def sift(li,low,high):
tmp=li[low]
i=low
j=2*i+1
while j<=high:
if j+1<=high and li[j]<li[j+1]:
j+=1 #若右孩子比较大,那么把j指向右孩子
if li[j]>tmp: #将大的调整到双亲节点位置,以便继续向下调整
li[i]=li[j]
i=j
j=2*i+1
else:
break
li[i]=tmp #将调整节点的值放入最后的位置
def heap_sort(li):
n=len(li)
for low in range(n//2-1,-1,-1): #建立初始堆,堆是有要求的,父节点大于子节点
sift(li,low,n-1)
for high in range(n-1,0,-1): #完成堆排序
li[0],li[high]=li[high],li[0]
sift(li,0,high-1)
li=[0,1,7,-1,2]
print(li)
heap_sort(li)
print(li)
代码解释
先建堆,建完堆之后,要进行堆排序,每次把最后一个和第一个交换,然后最后一个取出就是最大值。然后把剩下的再进行建堆,得到最大值。