Javascript:这个javascript实现合并排序有什么问题?

时间:2014-02-24 16:20:50

标签: javascript mergesort

我正在尝试使用javascript实现合并排序。 以下是我发现的逻辑上合理的代码,但在运行时失败。

    var a = [];
    for( i = 0 ; i < 10; i++){
        a.push(parseInt(Math.random()*100000));
    }
    function merge(a1, a2){
        var res = [];
        var i = 0, j = 0;
        while( i < a1.length && j < a2.length){
            if( a1[i] < a2[j] )
                res.push(a1[i++]);
            else
                res.push(a2[j++]);
        }
        while( i < a1.length )
            res.push(a1[i++]);

        while( j < a2.length )
            res.push(a2[j++]);
        return res;
    }

    function mergeSort(a){
        if( a.length <= 1 )
            return a;           
        var q = a.length/2;
        x = mergeSort(a.slice(0,q));
        y = mergeSort(a.slice(q));
        return merge(x,y);
    }

然而,mergeSort(a)方法中具有镜像更改的相同代码会提供所需的结果。 稍有改动的代码如下:

    var a = [];
    for( i = 0 ; i < 10; i++){
        a.push(parseInt(Math.random()*100000));
    }
    function merge(a1, a2){
        var res = [];
        var i = 0, j = 0;
        while( i < a1.length && j < a2.length){
            if( a1[i] < a2[j] )
                res.push(a1[i++]);
            else
                res.push(a2[j++]);
        }
        while( i < a1.length )
            res.push(a1[i++]);

        while( j < a2.length )
            res.push(a2[j++]);
        return res;
    }

    function mergeSort(a){
        if( a.length <= 1 )
            return a;           
        var q = a.length/2;         
        return merge(mergeSort(a.slice(0,q)),mergeSort(a.slice(q)));
    }

2 个答案:

答案 0 :(得分:2)

因为您没有使用'var'声明这些变量,所以它们是全局范围的:

x = mergeSort(a.slice(0,q));
y = mergeSort(a.slice(q));

答案 1 :(得分:1)

你的x和y变量是全局的(因为你没有用var声明它们是本地的),所以每次调用mergeSort函数时,它都会改变相同的变量,导致非常意外的行为。 / p>

修正:

function mergeSort(a){
    if( a.length <= 1 )
        return a;           
    var q = a.length/2;
    var x = mergeSort(a.slice(0,q));
    var y = mergeSort(a.slice(q));
    return merge(x,y);
}