2013-04-14 233 views
0

這是mergeSort的代碼,這會給第53行和第54行(mergeSort(l,m);和mergeSort(m,h);) 任何幫助將被視爲非常有價值,請幫助我,我無能爲力,謝謝。MergeSort給出StackOverflow錯誤

package codejam; 

public class vector { 
    static int[] a; 
    static int[] b; 
    public static void main(String[] args) { 
    int[] a1 = {12,33,2,1}; 
    int[] b1 = {12,333,11,1}; 
     mergeSort(0,a1.length); 
     a1=b1; 
     mergeSort(0,b1.length); 
     for (int i = 0; i < a1.length; i++) { 
      System.out.println(a[i]); 
     } 

    } 

    public static void merge(int l,int m,int h) { 
     int n1=m-l+1; 
     int n2 = h-m+1; 
     int[] left = new int[n1]; 
     int[] right = new int[n2]; 
     int k=l; 
     for (int i = 0; i < n1 ; i++) { 
      left[i] = a[k]; 
      k++; 
     } 
     for (int i = 0; i < n2; i++) { 
      right[i] = a[k]; 
      k++; 
     } 
     left[n1] = 100000000; 
     right[n1] = 10000000; 
     int i=0,j=0; 
     for (k =l ; k < h; k++) { 
      if(left[i]>=right[j]) 
      { 
       a[k] = right[j]; 
       j++; 
      } 
      else 
      { 
       a[k] = left[i]; 
       i++; 
      } 
     } 
    } 

    public static void mergeSort(int l,int h) { 
    int m =(l+h)/2; 
    if(l<h) 
    { 
     mergeSort(l,m); 
     mergeSort(m,h); 
     merge(l,m,h);; 
    } 

    } 
} 

回答

1

以下是與參數L = 0和h = 4

enter image description here

當L的值是0和h的值是1,表達的歸併函數的遞歸迭代表計算結果爲0的m值,但我們用h仍然是1來檢查條件如此0 < 1成爲true,這個mergeSort函數的遞歸調用就形成了一個模式,這個模式不讓函數終止,堆棧運行內存不足,導致stackoverflow錯誤。