大家可以查看我这篇文章中对堆和堆排序的描述:
下面是简单实现的堆
- 实现了四种方法:
- (1)heapify: 将数组调整为堆
- (2)heappop: 删除堆顶元素
- (3)heappush:向堆中添加元素
- (4)heapSort: 堆排序
- (5) 另外我实现的是大根堆,官网是小根堆,且下标都是从0开始。
大根堆代码展示:
class Heapq:
"""
生成大根堆
"""
def __HeapAdjust(self, nums: list, start: int, end: int) -> None:
"""
筛选法调整堆:
堆是以列表进行表示的, 假设 [start + 1, end] 已经是堆了,要把[start, end] 变为堆
"""
i = start
rc = nums[i]
while i * 2 + 1 <= end:
j = i * 2 + 1
if j < end and nums[j] < nums[j + 1]: j += 1
if rc >= nums[j]: break
nums[i] = nums[j]
i = j
nums[i] = rc
def __heapify(self, nums: list) -> None:
"""
将数组变为堆, 由完全二叉树的性质可知,(下标从1开始)所有下标大于 n // 2 的节点都是叶子结点,
而 叶子结点都是以自己为 根的堆。 我们只需要 将 前 0 - n // 2的 节点进行 调整堆,就可以把整个列表调整为堆
"""
n = len(nums)
for i in range((n + 1) // 2 - 1, -1, -1):
self.__HeapAdjust(nums, i ,n - 1)
def __pop(self, nums: list) -> int:
"""
删除堆中最大的元素,堆顶元素
"""
n = len(nums)
nums[0], nums[-1] = nums[-