我试图编写一个quickSort方法作为赋值的一部分,但我一直在Java中得到一个StackOverflow错误

时间:2015-04-18 22:02:04

标签: java sorting stack-overflow

这是我的排序尝试的代码。在Eclipse的调试器模式下运行大约十分钟后,我收到了很多StackOverFlow错误。这是我的输出显示:

线程“main”中的异常java.lang.StackOverflowError

在TestSorter.Tester.sort(Tester.java:6)

...(在TestSorter.Tester.sort(Tester.java:49)重复x112次)

在TestSorter.Tester.sort(Tester.java:49)

public static int[] sort(int[] a) {
                           int prod = (a.length)/2, b = lessThan(a, prod), c = greaterThan(a, prod), d = equalTo(a, prod);
    int[] first, last, mid;
    first = new int[b];
    last = new int[c];
    mid = new int[d];
    int[] fina = new int[a.length];
    int f = 0, l = 0, m = 0;

    if (isSorted(a))
        return a;

    for (int x = 0; x < a.length; x++) {
        if (a[x] < prod) {
            first[f] = a[x];
            f++;
        }
        else if (a[x] > prod) {
            last[l] = a[x];
            l++;
        }
        else if (a[x] == prod) {
            mid[m] = a[x];
            m++;
        }
    }
    if (m == a.length)
        return a;

                           first = sort(first);

    last = sort(last);

    for (int x = 0; x < b; x++) {
        fina[x] += first[x];
    }
    for (int x = 0; x < d; x++) {
        fina[x + b] = mid[x];
    }
    for (int x = 0; x < c; x++) {
        fina[x + b + c] = last[x];
    }

    return fina;
}

我的支持方法如下:

private static int lessThan(int[] a, int prod) {
    int less = 0;
    for (int x = 0; x < a.length; x++) {
        if (a[x] < prod) {
            less++;
        }
    }
    return less;
}

private static int greaterThan(int[] a, int prod) {
    int greater = 0;
    for (int x = 0; x < a.length; x++) {
        if (a[x] > prod) {
            greater++;
        }
    }
    return greater;
}

private static int equalTo(int[] a, int prod) {
    int equal = 0;
    for (int x = 0; x < a.length; x++) {
        if (a[x] == prod) {
            equal++;
        }
    }
    return equal;
}

private static boolean isSorted(int[] a) {
    for (int x = 0; x < a.length - 1; x++) {
        if (a[x] > a[x + 1])
            return false;
    }
    return true;
}

2 个答案:

答案 0 :(得分:1)

据推测,问题在于你的&#34; prod&#34;不在您的数组域内。因此,&#34;第一&#34;或者&#34;最后&#34;与输入数组大小相同,并且您具有无限递归。尝试将prod设置为您要排序的数组中的元素。

答案 1 :(得分:1)

三点:

  1. pord应该是数组的中间元素,而不是数组长度的一半。
    所以,它应该是prod =a[(a.length) / 2]
    不是prod =(a.length) / 2

  2. 如果数组第一个只有1个元素,则不需要再调用方法sort
    还有最后 所以,添加if声明:

    if (1 < first.length) {
        first = sort(first);
    }
    
  3. last元素追加到fina时,索引应为x+b+d,表示first元素(b)+ {{1} } elements(mid)。不是d
    因此,请将x+b+c更改为fina[x + b + c] = last[x];

  4. 嗯,方法fina[x + b + d] = last[x];可能是这样的:

    sort