如何使用 Python 堆进行排序?

2023-04-11 00:00:00 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']。可以看到,元素按字典序从小到大排序。

相关文章