最大堆Heapify方法失效,请求排查插入逻辑问题
问题原因分析:最大堆插入时Heapify(上浮)失效
你的代码存在两个核心错误,导致插入后无法形成正确的最大堆结构:
1. 父节点索引计算逻辑错误
最大堆的数组若从0索引开始,父节点索引的正确计算公式为:
(index - 1) / 2
而你实现的getParentIndex方法使用了Math.ceil((index - 2)/2),这个公式不仅冗余,还会在部分场景下出现计算偏差(比如index=0时得到-1,虽不影响循环,但逻辑不严谨)。更关键的是,这个公式依赖浮点数运算,容易因整数除法的特性引发不必要的错误。
2. 循环终止条件错误
你在insert方法中的循环条件是:
while (getParentIndex(index) > 0 && heap[index] > heap[getParentIndex(index)])
这个条件会导致节点无法上浮到根节点:当节点交换到index=1的位置时,其父节点索引是0,此时getParentIndex(index) > 0不成立,循环直接终止,不会比较当前节点与根节点的大小,也就无法完成最后一步交换(比如插入30时,无法将30从index=1的位置交换到根节点index=0)。
修正后的代码
修正父节点索引计算
private int getParentIndex(int index) { return (index - 1) / 2; }
修正插入方法的循环条件
private void insert(int num) { heap[heapSize] = num; heapSize++; int index = heapSize - 1; // 用index > 0判断,确保节点能上浮到根节点 while (index > 0 && heap[index] > heap[getParentIndex(index)]) { swap(index, getParentIndex(index)); index = getParentIndex(index); } }
修正后,插入15,5,10,30的流程会正常完成上浮:
- 插入30后,index=3,与父节点index=1(值5)交换,数组变为
[15,30,10,5] - index更新为1,继续与父节点index=0(值15)交换,数组变为
[30,15,10,5] - index更新为0,循环终止,得到正确的最大堆结构
内容的提问来源于stack exchange,提问作者osty2001
相关产品推荐
相关产品推荐

