Here we see a function PercolateDown() implemented in C++.
我只是无法理解为什么循环结束,长度/ 2次?
答案 0 :(得分:2)
当你构建max / min-heap时,你不需要堆积(PercolateDown)叶子,因为它们不能有任何比它们的父亲更大/更小的子项。
答案 1 :(得分:0)
请注意,教科书中的C ++源代码使用基于1的索引,
即array[0]
未使用,array[n]
应该是数组数据的有效引用。
符合C ++标准惯例(数组,矢量等,基于零的索引0 ... n-1)。
说明堆内的(基于1的)索引号(不是值):
1
2 3
4 5 6 7
8 9 10
如果您仔细阅读链接提供的文字,您会看到堆中位置i
的每个父节点在2*i
和2*i+1
位置只有这些位置的子节点不要超过数组的长度。
由于PercolateDown()算法将父项与子项交换,因此只需要length/2
次迭代。
此外,堆是从底部到顶部构建的。因此,迭代开始于n/2
上升,即朝向位置1
。