1.heapq模块
heapq模块中提供了一系列的堆(默认小根堆)操作,下面给出一些常用的方法:
nums=[20, 38, 100, 50, 94, 22, 35, 38, 0, 80, 90, 69, 37]
heap=[] # 建立空堆 由于堆是一个完全二叉树,完全二叉树的结点编号与列表下标存在一一对应的关系,因此本质上是一个列表
for i in range(len(nums)):
heapq.heappush(heap,nums[i]) # 向堆中插入元素
print(heap) # [0, 20, 22, 38, 80, 37, 35, 50, 38, 94, 90, 100, 69]
print(heap[0]) # 0 堆顶元素
print(heapq.heappop(heap)) # 0 堆顶元素弹出
heapq.heappushpop(heap,999) # 弹出堆顶元素,同时向heap中插入新的元素,较分开完成(heappop+heappush)更为高效
print(heap) # [22, 38, 35, 38, 80, 37, 999, 50, 69, 94, 90, 100]
heapq.heapify(nums) # 将列表调整为堆 时间复杂度O(n)
print(nums) # [0, 20, 22, 38, 80, 37, 35, 38, 50, 94, 90, 69, 100]
2.堆排序算法
利用heapq中的一些方法,可以很容易地完成堆排序:
def heapsort(seq):
res=[]
heap = list(seq)
heapq.heapify(heap)
while len(heap) != 0: