如果我们以自上而下的方式迭代 build-max-heap 会发生什么

What happens if we iterates build-max- heap in Top Down Manner

如果我们以自上而下的方式构造构建堆,时间复杂度很短,有什么缺点calculation.in使用第一种buid-max-heap堆算法比常用的第二种算法简单

Build-max-heap(A)
{
   A.heap-size=A.length
   for(i=1 to [A.lenth]/2)
   max-heapify(A,i)
}

Build-max-heap(A)
{
   A.heap-size=A.length
   for(i=[A.lenth]/2 downto 1)
   max-heapify(A,i)
}

正如所写,您的第一个示例不会执行任何操作,因为 i 小于 [A.length/2]。我怀疑你的意思是你的第一个例子是:

for (i=1 to [A.length]/2)

假设这就是您的意思,从上到下执行 min-heapify 不会产生有效的堆。考虑原始数组 [4,3,2,1],它表示这棵树:

        4
      3   2
    1

在第一次迭代中,您想将 4 向下移动。所以你用最小的 child 交换它并得到数组 [2,3,4,1].

接下来,您要过滤 3。因此您将其与最小的 child 交换,得到 [2,1,4,3]。您现在已经完成了,您的 "heap" 看起来像这样:

        2
      1   4
    3

这不是一个有效的堆。

当您从中间向上移动时,最小的项目可以过滤到顶部。但是,当您从上往下进行时,最小的项目可能永远无法到达顶部。

最大或最小堆是嵌套最大或最小函数的实现, 例如max(max(max(a, b), max(c, d)), ...),它是所有个数组元素的min()max()的一种表达式树,也就是你在实现max(a, b, c, ...)min(a, b, c, ...)。要产生正确的结果,您需要收集要比较的最小或最大元素。为此,您需要对底部元素进行广泛比较,然后向上,将需要比较的元素数除以每个级别 2(每个级别消除一半)。从上到下不会产生正确的结果;您正在执行错误的表达式。