我已经在javascript中实现了一组排序算法,用于培训目的。我的实现已经成功地排序了整数和单字符串数组,除了heapsort。
我的实现正确地对数组进行排序,除了在返回排序数组时将最小数字放到最后。
我不是CS学生/毕业生,也没有很多编程背景。我正在通过读/尝试/失败方法学习,我无法使其正常工作。
我会将代码及其结果放在此段落下方。最后,我想补充一点,我将this Wikipedia article的伪代码作为我实现的参考。
function heapSort(intl)
{
var l = intl.length,
end = l - 1,
swap;
intl = _heapify(intl,l);
while(end>0)
{
swap = intl[0];
intl[0] = intl[end];
intl[end] = swap;
--end;
intl = _siftDown(intl, 0, end);
}
return intl;
}
function _heapify(intl, l)
{
var start = (l - 2) / 2;
while(start >= 0)
{
intl = _siftDown(intl, start, l-1);
--start;
}
return intl;
}
function _siftDown(intl, start, end)
{
var root = start,
child, swap, swapr;
while(root*2+1 <= end)
{
child = root * 2 + 1;
swap = root;
if(intl[swap] < intl[child])
swap = child;
if(child+1 <= end && intl[swap]<intl[child+1])
swap = child + 1;
if(swap!=root)
{
swap = intl[root];
intl[root] = intl[swap];
intl[swap] = swap;
root = swap;
}else
{
return intl;
}
}
return intl;
}
x =
[24,5,896,624,437,5,6,4,37,45,654];
y =
["a","b","r","s","t","e","q","u","q"];
console.log(heapSort(x),"\n",heapSort(y));
通过nodejs运行代码:
$ node sort.js
[ 5, 5, 6, 24, 37, 45, 437, 624, 654, 896, 4 ]
[ 'b', 'e', 'q', 'q', 'r', 's', 't', 'u', 'a' ]
我试图通过更改代码找到错误的位置,但我找不到它。谁能说出问题出在哪里?提前谢谢。
答案 0 :(得分:1)
我看到了2个错误:
在_heapify
函数中,如果start
不是奇数,则l
变量不是整数:
var start = Math.floor( ( l - 2 ) / 2 );
在_siftDown
函数中,当您有效地交换数组的2个元素时,您使用了swap
而不是swapr
:
swapr = intl[root]; // <-- Here swapr instead of swap
intl[root] = intl[swap];
intl[swap] = swapr; // <-- Here swapr instead of the 1st occurrence of swap
root = swapr; // <-- Here swapr instead of swap