首先需要一个 import heapq的引用包
import heapq #引入heapq包
class Test:
def test(self):
#创建堆 这里为了后面添加 所以创建一个空堆
minheap=[]
heapq.heapify(minheap)#将列表转换为堆 如果这里初始minheap不为空 则会自动生成最小堆
#添加堆内元素
heapq.heappush(minheap,10)
heapq.heappush(minheap,8)
heapq.heappush(minheap,9)
heapq.heappush(minheap,2)
heapq.heappush(minheap,11)
heapq.heappush(minheap,1)
print(minheap) #输出结果为[1,2,9,10,8,11]
#查找堆顶元素
print(minheap[0]) #1
#删除元素/弹出堆顶元素 边输出边删除
heapq.heappop(minheap)
#长度
len(minheap)
#遍历
while len(minheap)!=0:
print(heap.heappop(minheap))
#将元素压入堆中,并弹出最小元素 调用的heapq.heappushpop() 相当于先调用heappush再调用heappop() 但是比它们分别调用的效率要高
b=heapq.heappushpop(minheap,0)
print(b) #0
print(minheap) #[1,2,9,10,8,11]
#弹出并返回heap中最小的一项 同时压入新的item 调用heapreplace() 相当于先调用heappop()再调用heappush() 效率同样比分别调用要高
c=heapq.heapreplace(minheap,0)
print(c) #1
print(minheap) #[0,2,9,10,8,11]
‘‘‘将多个已排序的输入合并为一个已排序的输出 调用heapq.merge(iterables, key=None, reverse=False)
其中iterables为多个已排序的输入,key为None时,直接比较元素的大小,reverse=True逆序排列‘‘‘
d = [0, 1, 3, 5]
e = [2, 6, 8, 9]
print(list(heapq.merge(d,e)))#[0, 1, 2, 3, 5, 6, 8, 9]
#返回前n个最大元素组成的列表 注意是列表!!
g=heapq.nlargest(3,minheap)
print(g) #[11,10,9]
#返回前n个最小元素组成的列表 注意是列表!!
f=heapq.nsmallest(3,minheap)
print(f) #[0,2,8]
#其中heapq.nlargest()和heapq.nsmallest()的参数都为(n,iterable,key=None)原理和上述的 heapq.merge()的
PS:Python默认构建最小堆 而没有方法来直接建立最大堆 一般来说都是通过使用取反的方式来进行最大堆的构建的
原文:https://www.cnblogs.com/leohbz/p/14725789.html