MAX_HEAPIFY实现

时间:2017-03-10 09:06:37

标签: javascript recursion heap

我编写了JavaScript代码来构建一个max heapify来维护max-heap属性,但是我对这个实现有很多疑问:

  

我测试的数组:[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]

为什么或为什么不是数组被排序影响的最大堆?

我发现当数组被排序时,解决方案是:

  

[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);
 }
}

2 个答案:

答案 0 :(得分:1)

有趣的问题;

只是为了确定,

function buildMaxHeap(array){
 return array.sort((a,b)=>b-a);
}

还会返回一个有效的数组。

因为目标只是提供树

  • root具有最大值键
  • 存储在非root用户的
  • 密钥最多为其父
  • 的值
  • 从root到leaf的任何路径都是以非递增顺序
  • 左右子树不相关

http://www.cs.toronto.edu/~krueger/cscB63h/w07/lectures/tut02.txt

算法交换父母和孩子直到满足这4个条件,所以是的,如果你从一个不同的数组开始,那么输出也可能不同。

从CodeReview的角度来看:

  • MAX_HEAPIFY - &gt; JavaScript遵循lowerCamelCase,因此maxHeapify
  • 您的缩进已关闭,请尝试使用http://jsbeautifier.org/
  • 之类的内容
  • 为什么要调用一个函数MAX_HEAPIFY而另一个函数BuildMaxHeap,这些名称彼此相似,不会告诉读者他们做了什么。

除此之外,没有太多可说的。

答案 1 :(得分:1)

正如您所注意到的,由一组数字组成的最小/最大堆可以根据它们的插入顺序而具有多个叶子配置。

您可能会认为这是全球排序&#39;叶子可能来自底层堆属性的某些紧急行为,但是给定的数组与特定配置没有一对一的对应关系。

这是因为插入了一个孩子并且冒泡(与父母交换),一旦它小于它的父母就会停止 - 其中可以是堆中位置的多个有效候选者。

当我第一次实现堆时,这对我来说很困惑。