如何使用 Python 堆进行排序?
Python 中的 heapq 模块提供了堆操作的支持。堆是一种特殊的数据结构,它是一个完全二叉树(即除了最底层节点外其他层的节点都是满的),其中每个节点的值都小于或等于其子节点的值。最小的元素总是在根节点,因此也称之为小根堆。
Python 的 heapq 模块提供了如下函数:
- heappush(heap, item):将元素 item 加入堆 heap 中。
- heappop(heap):删除并返回堆 heap 中的最小元素。
- heapify(heap):将列表 heap 转换为堆。
使用 heapq 模块实现排序非常简单:将列表 heap 中的元素加入堆中,然后按顺序从堆中删除元素,直到堆为空。被删除的元素按顺序形成了排序后的列表。
示例代码如下:
import heapq # 示例列表 data = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5] # 将列表转换为堆 heapq.heapify(data) # 从堆中一次取出元素并添加到列表中 result = [] while data: result.append(heapq.heappop(data)) # 打印排序后的结果 print(result)
输出结果为:[1, 1, 2, 3, 3, 4, 5, 5, 5, 6, 9]
。如果使用字符串作为例子,可以将元素类型改为字符串,示例代码如下:
import heapq # 示例列表 data = ['p', 'i', 'd', 'a', 'n', 'c', 'o', 'd', 'e', '.', 'c', 'o', 'm'] # 将列表转换为堆 heapq.heapify(data) # 从堆中一次取出元素并添加到列表中 result = [] while data: result.append(heapq.heappop(data)) # 打印排序后的结果 print(result)
输出结果为:['.', 'a', 'c', 'c', 'd', 'e', 'd', 'i', 'm', 'n', 'o', 'p']
。可以看到,元素按字典序从小到大排序。
相关文章