我正在介绍算法并将伪代码翻译成各种语言进行练习。
我坚持使用javascript。我无法弄清楚为什么我的合并功能失败并重复输入。你知道为什么吗?
谢谢
function mergesort(a){
if (a.length <=1) {
return a;
}
mid = Math.round((a.length/2));
left = a.slice(0, mid);
right = a.slice(mid);
console.log(left,right);
return merge(mergesort(left), mergesort(right));
}
function merge(left, right) {
sorted = [];
console.log(sorted,left, right, left[0], right[0]);
while (left && left.length >0 && right && right.length >0){
if (left[0] <= right[0]) {
sorted.push(left.shift());
console.log("left", left, right);
}
else {
sorted.push(right.shift());
console.log("left", left, right);
}
}
return sorted.concat(left,right);
}
a = [234,526,6,3,2,5];
mergesort(a);
答案 0 :(得分:2)
你的算法看起来很好,大的问题是你正在创建全局变量。在不使用var
关键字的情况下创建变量时,该变量将成为全局变量。
在您的情况下,第一次创建全局变量然后是连续的递归调用时,您不是创建新变量,而是重新分配到相同的全局变量。要解决此问题,只需在变量声明前添加var
,如此
var mid = Math.round((a.length/2));
var left = a.slice(0, mid);
var right = a.slice(mid);
...
...
...
var sorted = [];
通过该更改,结果将变为
[ 2, 3, 5, 6, 234, 526 ]