在计算机科学中,堆(Heap)是一种特殊的树形数据结构,常用于优先队列、图算法(如Dijkstra最短路径)以及高效地获取最大/最小元素。Python语言通过内置的 heapq 模块提供了对最小堆的原生支持。本教程将带你从零开始,轻松掌握Python堆数据结构的核心概念与实际应用。
堆通常是一棵完全二叉树,并满足以下性质之一:

Python 的 heapq 模块默认实现的是最小堆。如果你需要最大堆,可以通过对元素取负值来间接实现。
首先,导入 heapq 模块:
import heapq你可以从一个普通列表创建堆,使用 heapify() 函数将其转换为堆结构(就地操作,时间复杂度 O(n)):
import heapq# 初始化一个普通列表nums = [5, 7, 9, 1, 3]# 转换为最小堆heapq.heapify(nums)print(nums) # 输出可能是 [1, 3, 9, 7, 5](具体顺序取决于内部结构)使用 heappush(heap, item) 向堆中插入新元素:
heapq.heappush(nums, 2)print(nums) # 堆自动调整,保持最小堆性质使用 heappop(heap) 弹出并返回堆顶(最小)元素:
min_val = heapq.heappop(nums)print(min_val) # 输出 1print(nums) # 剩余元素仍保持堆结构利用堆的特性,我们可以轻松实现堆排序算法。步骤如下:
def heap_sort(arr): heapq.heapify(arr) sorted_list = [] while arr: sorted_list.append(heapq.heappop(arr)) return sorted_list# 测试original = [12, 3, 5, 7, 19, 1]sorted_result = heap_sort(original.copy())print("原始数组:", original)print("排序后:", sorted_result)# 输出:排序后: [1, 3, 5, 7, 12, 19]由于 heapq 只支持最小堆,我们可以通过存储元素的负值来模拟最大堆:
# 模拟最大堆max_heap = []for num in [3, 1, 4, 1, 5]: heapq.heappush(max_heap, -num) # 存入负值# 弹出最大值(需再取负)max_val = -heapq.heappop(max_heap)print(max_val) # 输出 5通过本教程,你已经掌握了:
heapq 模块进行堆操作;堆是算法面试和工程实践中非常实用的数据结构。熟练掌握 heapq模块 和 最小堆实现,将大大提升你解决优先级调度、Top-K 问题等场景的能力。
现在就动手试试吧!用堆优化你的下一个Python项目。
本文由主机测评网于2025-12-18发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://www.vpshk.cn/2025129576.html