2017-03-09 58 views
0
public class MergeSort 
{ 
public static double[] MergeSort(double[] a){ 
    if(a.length < 1){ 
     return new double[0]; 
    } 
    else if(a.length == 1){ 
     return a; 
    } 
    else{ 
     double[] l = Teiler(a, false); 
     double[] r = Teiler(a, true); 
     return Fueger(MergeSort(l), MergeSort(r)); 
    } 
} 
... 
} 

公共靜態雙[] Fueger(雙[]一,雙[] B): 返回包含從a和b以正確的順序的所有數字double數組。java.lang.StackOverflowError的在歸併

公共靜態雙[] Teiler(雙[]一,布爾值1): 返回一半的元素(前半,如果L是假的,第二半,如果L爲true)

Fueger和Teiler工作得很好,但MergeSort總是給出java.lang.StackOverflowError,即使遞歸一旦數組爲空或只包含一個元素就應該終止。 問題是什麼?

感謝您的幫助

這裏是Fueger:

public static double[] Fueger(double[] a, double[] b){ 
    double[] hilf = new double[a.length + b.length]; 
    int i = 0; 
    while((a.length != 0) && (b.length != 0)){ 
     if(a[0] < b[0]){ 
      hilf[i] = a[0]; 
      a = Weg(a); 
     } 
     else{ 
      hilf[i] = b[0]; 
      b = Weg(b); 
     } 
     i++; 
    } 
    if(a.length != 0){ 
     for(double x : a){ 
      hilf[i] = x; 
      a = Weg(a); 
      i++; 
     } 
    } 
    if(b.length != 0){ 
     for(double x : b){ 
      hilf[i] = x; 
      b = Weg(b); 
      i++; 
     } 
    } 
    return hilf; 
} 

Teiler:

public static double[] Teiler(double[] a, boolean r){ 
    double[] hilf; 
    int x = 0; 
    if(r == false){ 
     hilf = new double[(int) a.length/2]; 
     for(int i = 0; i < a.length/2; i++){ 
      hilf[x] = a[i]; 
      i ++; 
     } 
    } 
    else{ 
     hilf = new double[(int) (a.length/2) + 1]; 
     for(int i = a.length/2; i < a.length; i++){ 
      hilf[x] = a[i]; 
      i ++; 
     } 
    } 
    return hilf; 
} 
+0

您是否具有堆棧跟蹤(在StackOverflow發生時打印整個錯誤文本)?請在這裏發佈。 – kennytm

+1

我懷疑堆棧跟蹤是否有幫助。我懷疑這只是大量的'MergeSort'行自行調用。看到'Teiler'方法會更有用 - 我有一種感覺,那就是錯誤的可能性。 –

+0

在MergeSort.MergeSort(MergeSort.java:11)​​ \t在MergeSort.MergeSort(MergeSort.java:13) \t在MergeSort.MergeSort(MergeSort.java:13) –

回答

3

的問題是在Teiler方法。考慮一個長度爲2的列表,else分支創建一個長度爲2而不是1的列表(儘管它只填充第一個元素)。因此,陷入無限循環的遞歸。您可以通過僅在長度奇數時添加最後一個元素來輕鬆修復此問題:

public static double[] Teiler(double[] a, boolean r){ 
    double[] hilf; 
    int x = 0; 
    if(r == false){ 
     hilf = new double[(int) a.length/2]; 
     for(int i = 0; i < a.length/2; i++){ 
      hilf[x] = a[i]; 
      i ++; 
     } 
    } else{ 
     hilf = new double[(int) (a.length/2) + (a.length % 2)]; 
     for(int i = a.length/2; i < a.length; i++){ 
      hilf[x] = a[i]; 
      i ++; 
     } 
    } 
    return hilf; 
} 
+1

這是絕對有效的方法 - 但我喜歡寫這樣的東西像'int bottomSize = a.length/2; int topSize = a.length-bottomSize;'哪種自我證明我們關心另一半的剩菜剩飯。 –

+0

@ArturBiesiadowski夠公平:) –

相關問題