构建堆过程。
Build Heap Procedure.
通过调整以节点⌊(n−1)/2⌋开始的完全二叉树的每个内部节点为根的堆并将此调整向上进行,可以将大小为n的整数数组转换为堆按⌊(n−1)/2, ⌊(n−3)/2⌋, ....., 0.
的顺序到根节点(根节点在索引 0 处)
=========================================== =============================
我知道,这是一个构建堆过程,需要 O(n) 的时间,但是有人可以通过使用 n 值较小的数组来形象化地展示事情是如何工作的吗?
让我们用数组[7, 3, 9, 1, 2, 4, 8, 5, 6, 0]
做一个例子。树结构为:
7
3 9
1 2 4 8
5 6 0
堆中有 10 个项目。因此,从索引 (n/2)-1(第一个 non-leaf 节点)开始,我们看到值 2 大于其值 child。我们交换,给出:
7
3 9
1 0 4 8
5 6 2
接下来,1小于它的children,所以我们不用管它。
9 比它的两个 children 都大。规则是将它与最小的 child 交换,给出:
7
3 4
1 0 9 8
5 6 2
3 比它的两个 children 都大,所以用 0 交换它。它也比 2 大,所以我们再做一次交换。结果是:
7
0 4
1 2 9 8
5 6 3
最后,7 比 0 大,所以我们交换它,将 0 放在根部。 7 也比它的两个 children 大,所以我们把它和 1 交换。而 7 比 5 和 6 大,所以我们把它交换到叶级。结果是:
0
1 4
5 2 9 8
7 6 3
这是有效的 min-heap。
通过调整以节点⌊(n−1)/2⌋开始的完全二叉树的每个内部节点为根的堆并将此调整向上进行,可以将大小为n的整数数组转换为堆按⌊(n−1)/2, ⌊(n−3)/2⌋, ....., 0.
的顺序到根节点(根节点在索引 0 处)=========================================== =============================
我知道,这是一个构建堆过程,需要 O(n) 的时间,但是有人可以通过使用 n 值较小的数组来形象化地展示事情是如何工作的吗?
让我们用数组[7, 3, 9, 1, 2, 4, 8, 5, 6, 0]
做一个例子。树结构为:
7
3 9
1 2 4 8
5 6 0
堆中有 10 个项目。因此,从索引 (n/2)-1(第一个 non-leaf 节点)开始,我们看到值 2 大于其值 child。我们交换,给出:
7
3 9
1 0 4 8
5 6 2
接下来,1小于它的children,所以我们不用管它。
9 比它的两个 children 都大。规则是将它与最小的 child 交换,给出:
7
3 4
1 0 9 8
5 6 2
3 比它的两个 children 都大,所以用 0 交换它。它也比 2 大,所以我们再做一次交换。结果是:
7
0 4
1 2 9 8
5 6 3
最后,7 比 0 大,所以我们交换它,将 0 放在根部。 7 也比它的两个 children 大,所以我们把它和 1 交换。而 7 比 5 和 6 大,所以我们把它交换到叶级。结果是:
0
1 4
5 2 9 8
7 6 3
这是有效的 min-heap。