堆排序能否实现列表降序排序?附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
相关产品推荐
相关产品推荐

