Python3,手写一个堆 及其 简易功能,并实现优先队列,最小堆任务调度等

大家可以查看我这篇文章中对堆和堆排序的描述:

下面是简单实现的堆

  • 实现了四种方法:
  • (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
            # 判断左右子节点哪个大, nums[j] < end 说明存在右子节点
            if j < end and nums[j] < nums[j + 1]: j += 1
            # 将 rc 与 最大的子节点比较, 如果大于等于当前子节点,说明该插入到这
            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[-
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值