algorithm - Heapsort: Build max heap 过程解释
问题描述
我正在尝试理解使用堆排序对数组进行排序的代码(参考 - https://www.sanfoundry.com/java-program-implement-heap-sort/)
“maxheap”函数使用此计算来获取节点的左右子节点(在多个不同的示例/站点中使用相同)
int 左 = 2*i;
整数右 = 2*i + 1;
以上的逻辑/推理是什么?
此外,在 heapify 函数中,使用 i = N/2 -> 0 调用 maxheap fn
(例如,而不是 i = 0 到 N -1。)关于为什么这样做的任何想法?
public static void heapify(int arr[])
{
N = arr.length-1;
for (int i = N/2; i >= 0; i--)
maxheap(arr, i);
}
解决方案
以上的逻辑/推理是什么?
堆是一棵二叉树,并且在一个基于 1 的索引数组中,如下所示,要获取节点的左子节点i
,您需要索引2*i
,而右子节点则需要索引2*i + 1
。
Array:
[1, 2, 3, 4, 5, 6, 7]
Binary tree:
1
/ \
2 3
/ \ / \
4 5 6 7
此外,在 heapify 函数中,使用 i = N/2 -> 0 调用 maxheap fn (例如,而不是 i = 0 到 N -1。)关于为什么这样做的任何想法?
maxheap
or max_heapify
function 是一个过程,它获取一个数组和一个索引i
作为输入以维护最大堆属性。的假设max_heapify
是节点的左右子树i
是最大堆,但节点i
可能违反最大堆属性(它可能小于其子节点)。
这意味着如果我们调用max_heapify
所有数组元素,所有节点都将保持最大堆属性,我们应该得到一个最大堆。但是,如果我们从数组的开头(树的根)开始,我们不能假设左右子树已经是最大堆,因此我们需要从结尾(树的叶子)开始并走到开头。另外叶子没有孩子,所以它们已经是最大堆了,我们不需要打电话max_heapify
在他们。在具有 n 个元素的堆中,子数组[floor(n/2)+1..n]
中的节点是叶子,因此我们可以从floor(n/2)
to循环1
并max_heapify
仅在内部节点上调用。
对于基于 0 的数组:
left(i): 2 * i + 1
right(i): 2 * i + 2
leaves: [floor(n/2)..n-1]
internal nodes: [0..floor(n/2)-1]
推荐阅读
- git - Tortoise GIT 回滚到上一个提交
- mysql - 从不同的mysql表中查询字段
- python - 发生异常:TimeoutException
- excel - 将单元格值从一张表复制到另一张表,并将其粘贴到具有特定值的单元格附近
- apache-nifi - 流文件卡在队列中(Apache NiFi)
- ios - 在 Swift 的函数错误中无法调用非函数类型“SwipeCard”的值
- python-3.x - 将数据框中的列添加到具有相同行的另一个数据框中
- r - R模拟空间点数据,其中点与前一点的距离最大
- power-automate - Power automate notification during work hours
- python - 制作滚动条但不一致