堆是一种特殊的数据结构,是一颗完全二叉树,任何一个非叶子节点的值大于或小于其孩子节点。因此采用堆进行排序时可以用O(1)的复杂度获取其堆顶的最大或最小值,对剩下的值以log(n)的复杂度使其重新满足堆的性质。
2、算法思路:step1、构造堆结构。按照堆的定义:非叶子节点的值大于或小于其孩子节点。遍历每个非叶子节点,如果不符合堆的定义则交换。
step2、经过一轮整理,当前数组的最大值或最小值已经浮到堆顶,每次将其拿出后再对剩余数组按step1进行堆构造。
def topHeap(list,size):
#i节点的子节点为2i+1,2i+2
for i in range(size-1,-1,-1):
if 2*i+1list[i]:
list[2*i+1],list[i]=list[i], list[2*i+1]
if 2*i+2list[i]:
list[2*i+2],list[i]=list[i], list[2*i+2]
list=[11,2,3,4,12,18,16]
for i in range(len(list),0,-1):
topHeap(list,i)
list[0],list[i-1]=list[i-1],list[0] #每轮交换栈顶元素至相应位置
print(list)
3.2、小顶堆
def topHeap(list,size): #i节点的子节点为2i+1,2i+2
for i in range(size-1,-1,-1):
if 2*i+1


