堆排序-为什么PercolateDown()中的循环迭代(length/2)次

Heapsort - Why the loop in PercolateDown() iterates (length/2) times?

本文关键字:迭代 length 循环 为什么 PercolateDown 堆排序      更新时间:2023-10-16

这里我们看到一个用C++实现的函数PercolateDown()。

我只是不明白为什么循环结束于,长度/2次?

此外,为什么构建堆中的循环从n/2开始?

当你构建最大/最小堆时,你不需要堆(PercolateDown)叶子,因为它们不能有比父母更大/更小的孩子。

请注意,教材中的C++源代码使用基于1的索引,即不使用CCD_ 1并且CCD_。

这与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