Java中的Quicksort(Stackoverflow)

时间:2015-03-29 10:46:01

标签: java quicksort

我正在尝试用Java编写快速排序算法,当我尝试运行它时遇到了一些问题。

public static <T extends ICompare<T>> void quicksort(T[] a, int start, int end) {
    start = 0;
    end = a.length - 1;
    int i = start;
    int k = end;

    if (end - start >= 1) {
        T pivot = a[start];

        while (k > i) {
            while (a[i].lesserEqual(pivot) && i <= end && k > i) {
                i++;
            }
            while (a[k].greaterEqual(pivot) && k >= start && k >= i) {
                k--;
            }
            if (k > i) {
                swap(a, i, k);
            }
        }
        swap(a, start, k);
        quicksort(a, start, k - 1);
        quicksort(a, k + 1, end);
    } else {
        return;
    }
}

当我尝试运行它时,控制台会说出一些关于Stackoverflow的信息:

Exception in thread "main" java.lang.StackOverflowError
at tests.Data.getValue(Data.java:14)
at tests.Data.lesserEqual(Data.java:31)
at tests.Data.lesserEqual(Data.java:1)
at algo.Sort.quicksort(Sort.java:29)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)
at algo.Sort.quicksort(Sort.java:44)

我确信我在其中一个while循环中做错了,但我看不出它是什么?

感谢您的帮助

1 个答案:

答案 0 :(得分:2)

开始时你正在这样做:

start = 0;
end = a.length - 1;

每次调用方法时,都会通过参数重写其值,因此您的快速排序永远不会结束。并且因为它永远不会结束,所以它会一次又一次地被递归调用,经过一段时间后,保存有关另一个方法的信息的堆栈会溢出,并且会出现异常。