在javascript中合并排序

时间:2014-02-16 03:53:52

标签: javascript

我正在介绍算法并将伪代码翻译成各种语言进行练习。

我坚持使用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);

1 个答案:

答案 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 ]