Javascript MAX_HEAPIFY实现

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] 为什么在对数组

我编写了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中的伪代码我发现我的实现是正确的

您能否指定另一个在实现相同功能时不使用递归的过程

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);
}
还将返回一个有效数组

因为目标仅仅是提供一棵树

  • 根具有最大值键
  • 存储在非根目录中的键最多是其父目录的值
  • 从根到叶的任何路径都是按非递增顺序排列的
  • 左、右子树是不相关的
()

该算法交换父级和子级,直到满足这4个条件,因此是的,如果从不同的数组开始,那么输出也可能不同

从CodeReview的角度来看:

  • MAX\u HEAPIFY
    ->JavaScript遵循lowerCamelCase,所以maxHeapify
  • 您的缩进已关闭,请尝试使用以下内容
  • 为什么要调用一个函数
    MAX_HEAPIFY
    和另一个函数
    BuildMaxHeap
    ,它们的名称彼此相似,并不告诉读者它们是做什么的

除此之外,没什么好说的。

正如您所注意到的,由一组数字组成的最小/最大堆可以有多个叶的配置,具体取决于它们的插入顺序

您可能认为叶的这种“全局排序”可能是由于底层堆属性的某些紧急行为引起的,但是给定的数组与特定的配置没有一对一的对应关系

发生这种情况的原因是如何插入和弹出子对象(与父对象交换),当子对象小于其父对象时,子对象将立即停止—堆中的某个位置可能有多个有效候选对象


当我第一次实现堆时,这也让我感到困惑。

我真的在问为什么代码没有按预期执行。让人们知道我在做什么