最大堆算法任务

Max-Heapify Algorithm Task

设 A[1...9] = 3 9 5 4 8 6 11 7 2 为一个由 9 个数字组成的数组。说明执行代码Max - Heapify(A, 4, 9), Max-Heapify(A,3,9), Max-Heapify(A,2,9), Max-Heapify(A,1, 9).

为什么may数组不对?

我画了一个堆树

之后我试着做了

Heapify(A,4,9)值4和2交换 3 9 5 2 8 6 11 7 4 -> 我排序了 3 9 5 7 8 6 11 2 4

Max-Heapify(A,3,9) -> 值5和4交换

3 9 4 7 8 6 11 2 5 -> 我排序了 3 9 11 7 8 6 4 2 5 -> 11 9 3 7 8 6 4 2 5

Max-Heapify(A,2,9) -> 值 11 和 9 交换

11 9 6 7 8 3 4 2 5

Max-Heapify(A,1,9) -> 值 11 和 5 5 9 6 7 8 3 4 2 11 -> 如何排序是从父节点开始还是从下到上?有什么提示可以在数组中而不是绘制堆树来解决这个问题吗?

解:11 9 6 7 8 3 5 4 2

您以某种方式将 MaxHeapify 解释为在做一些不应该做的事情。比如你写:

Heapify (A, 4, 9) value 4 and 2 exchange

没有。索引 4 处的值的子项位于索引 8 和 9。要知道节点的子项位于何处,请将索引加倍并添加 0 或 1。(索引 8)处的 7 大于索引 4 处的父项,因此交换在值 4 和 7 之间。结果:

3 9 5 7 8 6 11 4 2
      *        * *

请注意,在这次交换之后,索引为 4 的节点的两个子节点都变小了。

Heapify (A, 3, 9) 将比较索引 3 (5) 的值与其索引 6 和 7 的子值。6 和 11 的值:11 必须向上冒泡:

3 9 11 7 8 6 5 4 2
     *     * *

Heapify (A, 2, 9) 会将索引 2 (9) 的值与其索引 4 和 5 的子值进行比较:值 7 和 8:这没关系;无变化:

3 9 11 7 8 6 5 4 2
  *    * *

Heapify (A, 1, 9) 将比较索引 1 (3) 的值与其索引 2 和 3 的子值:值 9 和 11:11 必须冒泡:

11 9 3 7 8 6 5 4 2
*  * *

此时堆已完全堆化:对于每个节点,您现在拥有其值大于(或等于)其子节点的值。这就是一堆。堆不是排序数组。为了降序获取值,需要根据extract算法从堆顶弹出元素:取出前面的元素,将尾元素放在那里,使array 1 元素变短,然后将前面的值向下筛选到堆中(通过交换),直到堆 属性 恢复。

您可以在 Wikipedia.

阅读与堆结构相关的所有函数