修改heapify函数后堆排序失效,两段逻辑看似一致的故障原因排查
堆排序修改后无法运行的问题原因
核心错误:两段代码逻辑并不等价,边界分支处理完全错误
你修改后的三目运算在右孩子不存在的场景下会返回非法索引,直接破坏堆调整逻辑:
- 原代码逻辑(正确):
int largest = left + 1 < size && arr[left + 1] > arr[left] ? left + 1 : left;
执行规则:
- 先判断右孩子是否存在(
left + 1 < size),如果不存在,直接返回左孩子索引left - 右孩子存在时,比较左右孩子值,返回值更大的那个索引
完全符合大顶堆找子节点最大值的需求。
- 修改后代码逻辑(错误):
int largest = (left + 1) < size && arr[left +1 ] < arr[left] ? left : (left + 1);
执行规则:
- 只有同时满足「右孩子存在」和「右孩子值小于左孩子」两个条件时,才返回左孩子索引
left - 其他所有场景都返回
left + 1
当右孩子不存在时,整个&&判断结果为false,直接返回越界索引left + 1,访问该索引下的数组元素要么触发越界异常,要么拿到无效值,最终导致堆排序完全失效。
等价改写方案
如果你要翻转判断条件,正确的等价写法应该处理好边界分支:
// 与原代码逻辑完全等价的改写版本 int largest = (left + 1 >= size) || (arr[left] >= arr[left + 1]) ? left : left + 1;
内容的提问来源于stack exchange,提问作者pa pa
相关产品推荐
相关产品推荐

