簡體   English   中英

Javascript:合並排序的JavaScript實現有什么問題?

[英]Javascript: What is wrong with this javascript implementation of merge sort?

我正在嘗試使用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)));
    }

由於尚未使用'var'聲明這些變量,因此它們在全局范圍內:

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

您的x和y變量是全局變量(因為尚未使用var將它們聲明為局部變量),因此,每次調用mergeSort函數時,它將更改相同的變量,從而導致非常意外的行為。

固定:

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);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM