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

堆排序能否实现列表降序排序?附Python代码求错误排查

堆排序能否实现降序排序

堆排序完全支持对列表做降序排序。升序堆排序通常基于大顶堆实现,只需将堆结构调整为小顶堆,或是在大顶堆排序完成后反转结果,即可得到降序序列。你当前的代码存在多处基础逻辑错误,无法得到正确排序结果。

代码错误点明细
  • 建堆循环逻辑错误:建堆需要从最后一个非叶子节点倒序遍历到根节点,你写的range(len(list)//2-1, len(list))是从最后一个非叶子节点正序遍历到数组末尾,完全不符合建堆规则,正确范围应为range(len(list)//2 - 1, -1, -1)。
  • 子节点索引计算错误:顺序存储的堆结构中,索引为i的节点,左子节点固定为2*i + 1、右子节点固定为2*i + 2,你写的len(list) - (2*i+1)属于错误的索引计算,根本无法定位到正确的子节点。
  • 排序阶段传参与交换逻辑错误:你在交换堆顶元素后,传入的堆有效长度i不符合未排序区间的实际长度,交换位置也不符合堆排序“将堆顶元素移动到已排序区边界”的逻辑,会导致堆调整范围错乱。
  • 额外问题:使用list作为参数名会覆盖Python内置的列表类型,存在潜在隐患,建议替换为其他变量名如arr。
可直接运行的降序堆排序修正代码

以下代码基于小顶堆实现,无需额外反转即可直接输出降序结果:

def heap_sort(arr):
    n = len(arr)
    # 构建小顶堆
    for i in range(n // 2 - 1, -1, -1):
        heapify(arr, i, n)
    # 逐次提取堆顶最小值放到未排序区间末尾,最终得到降序数组
    for i in range(n - 1, 0, -1):
        arr[i], arr[0] = arr[0], arr[i]
        heapify(arr, 0, i)
    return arr

def heapify(arr, i, n):
    smallest = i
    left = 2 * i + 1
    right = 2 * i + 2
    # 找出当前节点、左右子节点中的最小值
    if left < n and arr[left] < arr[smallest]:
        smallest = left
    if right < n and arr[right] < arr[smallest]:
        smallest = right
    # 若最小值不是当前节点,交换后递归调整受影响的子堆
    if smallest != i:
        arr[i], arr[smallest] = arr[smallest], arr[i]
        heapify(arr, smallest, n)

测试示例:传入[3,1,4,1,5,9,2,6],返回结果为[9,6,5,4,3,2,1,1],符合降序排序要求。

内容的提问来源于stack exchange,提问作者Arnav Sharma

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 15:09:21