2014-02-24 102 views
0

我想實現使用javascript合併排序。 以下是我發現的代碼在邏輯上合理,但在運行時失敗。Javascript:這個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

因爲你還沒有宣佈這些變量與「變種」,他們是全局範圍:

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

謝謝你,「var'ing他們固定的問題。通過這個,我已經瞭解到,如果我不改變他們,那麼他們不屬於本地範圍。 –

1

你的變量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); 
} 
+0

謝謝,'讓他們解決問題。通過這個,我已經瞭解到,如果我不改變他們,那麼他們不屬於本地範圍。 –