You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python实现最大堆插入函数测试失败,求代码问题排查

最大堆插入函数bug分析与修复

核心问题点

  • 循环退出逻辑错误:当满足终止条件(父节点值≥插入值/已到根节点)时,仅设置了循环终止标记b=False,但没有跳过后续的交换逻辑,导致最后一次不必要的错误交换,这是本次测试用例失败的直接原因。
  • 入参修改逻辑错误:每次调用函数都会直接修改传入的原数组,在头部插入占位0,若同一个堆数组多次调用插入接口会出现逻辑混乱,不符合函数无副作用的通用设计要求。

错误触发逻辑说明

你的测试用例执行到第二次循环时,当前节点索引为4,对应父节点索引为2,父节点存储的值为30,插入值19≤30已经满足终止条件,但代码仍然执行了交换操作,将父节点的30和当前节点的19互换,最终导致父节点值19小于子节点值30,违反最大堆性质。

修复后的实现

这里改用更通用的0索引堆实现,不需要额外插入占位元素,同时规避原入参被修改的问题:

def insertinmaxheap(arryhp, num):
    # 复制原数组避免修改传入的参数
    heap = arryhp.copy()
    heap.append(num)
    current_idx = len(heap) - 1
    # 向上遍历调整堆结构
    while current_idx > 0:
        parent_idx = (current_idx - 1) // 2
        # 父节点值大于等于插入值,满足最大堆性质,终止调整
        if heap[parent_idx] >= num:
            break
        # 交换父节点和当前节点的值
        heap[current_idx] = heap[parent_idx]
        heap[parent_idx] = num
        current_idx = parent_idx
    return heap

调用测试用例insertinmaxheap([50, 30, 20, 15, 10, 8, 16], 19),输出结果为[50, 30, 20, 19, 10, 8, 16, 15],符合最大堆性质要求。

内容的提问来源于stack exchange,提问作者Mama africa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 15:45:07