Heapsort - 为什么PercolateDown()循环迭代(长度/ 2)次?

时间:2012-03-03 11:32:48

标签: c++ heapsort

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*i2*i+1位置只有这些位置的子节点不要超过数组的长度。

由于PercolateDown()算法将父项与子项交换​​,因此只需要length/2次迭代。

此外,堆是从底部到顶部构建的。因此,迭代开始于n/2上升,即朝向位置1