我编写了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);
}
}
答案 0 :(得分:1)
有趣的问题;
只是为了确定,
function buildMaxHeap(array){
return array.sort((a,b)=>b-a);
}
还会返回一个有效的数组。
因为目标只是提供树
(http://www.cs.toronto.edu/~krueger/cscB63h/w07/lectures/tut02.txt)
算法交换父母和孩子直到满足这4个条件,所以是的,如果你从一个不同的数组开始,那么输出也可能不同。
从CodeReview的角度来看:
MAX_HEAPIFY
- &gt; JavaScript遵循lowerCamelCase,因此maxHeapify MAX_HEAPIFY
而另一个函数BuildMaxHeap
,这些名称彼此相似,不会告诉读者他们做了什么。除此之外,没有太多可说的。
答案 1 :(得分:1)
正如您所注意到的,由一组数字组成的最小/最大堆可以根据它们的插入顺序而具有多个叶子配置。
您可能会认为这是全球排序&#39;叶子可能来自底层堆属性的某些紧急行为,但是给定的数组与特定配置没有一对一的对应关系。
这是因为插入了一个孩子并且冒泡(与父母交换),一旦它小于它的父母就会停止 - 其中可以是堆中位置的多个有效候选者。
当我第一次实现堆时,这对我来说很困惑。