Javascript MAX_HEAPIFY实现
我编写了JavaScript代码来构建一个维护max heap属性的max heapify,但是对于实现我有很多问题: 阵列I测试:[1,2,3,4,7,8,9,10,14,16] 当我在数组上进行测试时,当它被排序时,我得到: [16,14,9,10,7,8,3,1,4,2] 未分类时,我得到: [16,14,8,9,10,2,3,4,7,1] 最大heapify为什么或为什么不受排序数组的影响 我发现当数组排序时,解决方案是: [16,14,10,8,7,9,3,2,4,1] 为什么在对数组进行排序时会得到不同的解决方案,即使根据CLRS中的伪代码我发现我的实现是正确的 您能否指定另一个在实现相同功能时不使用递归的过程Javascript MAX_HEAPIFY实现,javascript,recursion,heap,Javascript,Recursion,Heap,我编写了JavaScript代码来构建一个维护max heap属性的max heapify,但是对于实现我有很多问题: 阵列I测试:[1,2,3,4,7,8,9,10,14,16] 当我在数组上进行测试时,当它被排序时,我得到: [16,14,9,10,7,8,3,1,4,2] 未分类时,我得到: [16,14,8,9,10,2,3,4,7,1] 最大heapify为什么或为什么不受排序数组的影响 我发现当数组排序时,解决方案是: [16,14,10,8,7,9,3,2,4,1] 为什么在对数组
function BuildMaxHeap(array){
for(var i = Math.floor(array.length / 2); i >= 0; i--){
MAX_HEAPIFY(array, i);
}
return array;
}
function MAX_HEAPIFY(array, i) {
var left = 2 * i + 1;
var right = 2 * i + 2;
var largest = i;
if(left <= array.length && array[left] > array[largest]){
largest = left;
}
if(right <= array.length && array[right] > array[largest]){
largest = right;
}
if(largest != i){
var temp = array[i];
array[i] = array[largest];
array[largest] = temp;
MAX_HEAPIFY(array, largest);
}
}
函数BuildMaxHeap(数组){
对于(var i=Math.floor(array.length/2);i>=0;i--){
MAX_HEAPIFY(数组,i);
}
返回数组;
}
函数MAX_HEAPIFY(数组,i){
左变量=2*i+1;
var right=2*i+2;
var=i;
if(左数组[最大]){
最大=左;
}
if(右数组[最大]){
最大=右;
}
如果(最大!=i){
var-temp=数组[i];
数组[i]=数组[最大];
数组[最大]=温度;
MAX_HEAPIFY(数组,最大);
}
}
有趣的问题
平心而论
function buildMaxHeap(array){
return array.sort((a,b)=>b-a);
}
还将返回一个有效数组
因为目标仅仅是提供一棵树
- 根具有最大值键
- 存储在非根目录中的键最多是其父目录的值
- 从根到叶的任何路径都是按非递增顺序排列的
- 左、右子树是不相关的
->JavaScript遵循lowerCamelCase,所以maxHeapifyMAX\u HEAPIFY
- 您的缩进已关闭,请尝试使用以下内容
- 为什么要调用一个函数
和另一个函数MAX_HEAPIFY
,它们的名称彼此相似,并不告诉读者它们是做什么的BuildMaxHeap
除此之外,没什么好说的。正如您所注意到的,由一组数字组成的最小/最大堆可以有多个叶的配置,具体取决于它们的插入顺序 您可能认为叶的这种“全局排序”可能是由于底层堆属性的某些紧急行为引起的,但是给定的数组与特定的配置没有一对一的对应关系 发生这种情况的原因是如何插入和弹出子对象(与父对象交换),当子对象小于其父对象时,子对象将立即停止—堆中的某个位置可能有多个有效候选对象
当我第一次实现堆时,这也让我感到困惑。我真的在问为什么代码没有按预期执行。让人们知道我在做什么