MergeSort

时间:2017-03-09 08:36:12

标签: java sorting stack-overflow mergesort

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

public static double [] Fueger(double [] a,double [] b): 返回一个包含a和b中所有数字的双精度数组。

public static double [] Teiler(double [] a,boolean l): 返回一半元素(前半部分,如果l为假,后半部分,如果l为真)

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

1 个答案:

答案 0 :(得分: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;
}