用于quicksort Java的StackOverFlowError

时间:2014-05-02 07:41:42

标签: java quicksort

我正在测试我写的快速排序代码,但我不确定我为什么会这样做

错误:

Exception in thread "main" java.lang.StackOverflowError
    at java.util.ArrayList$Itr.<init>(ArrayList.java:820)
    at java.util.ArrayList.iterator(ArrayList.java:814)
    at practice.Quicksort.quicksort(Quicksort.java:15)
    at practice.Quicksort.quicksort(Quicksort.java:25)
    at practice.Quicksort.quicksort(Quicksort.java:25)
    at practice.Quicksort.quicksort(Quicksort.java:25)

第15行是:

for (int n : arr) {

和第25行是:

more = quicksort(more);

代码:

public class Quicksort {
    public static List<Integer> quicksort(List<Integer> arr) {
        if (arr.size() <= 1) {
            return arr;
        }
        List<Integer> less = new ArrayList<Integer>();
        List<Integer> more = new ArrayList<Integer>();
        int pivotIndex = arr.size() / 2;
        int pivot = arr.get(pivotIndex);
        for (int n : arr) {
            if (n < pivot) {
                less.add(n);
            }
            else {
                more.add(n);
            }
        }
        // recursively sort
        less = quicksort(less);
        more = quicksort(more);

        // concatenate all
        less.add(pivot);
        less.addAll(more);
        return less;
    }

    public static void main(String[] args) {
        List<Integer> test = new ArrayList<Integer>();
        int[] arr = {2,4,1,4,5,2,-10,3,0,33,23};
        for (int c : arr) {
            test.add(c);
        }
        System.out.println(quicksort(test));
    }
}

2 个答案:

答案 0 :(得分:1)

列表more不应包含数据透视表。如果它运行了more与传入的列表完全相同的风险,并且在程序用尽堆栈空间之前,您将获得无限递归循环。

一种常见的技巧是使用列表中的第一项交换枢轴,然后从第二项开始创建lessmore的列表。

答案 1 :(得分:1)

您的代码存在一个基本缺陷,这增加了在后续两次迭代中名为more的列表相同的可能性。可能的问题出在代码的以下部分:

 int pivotIndex = arr.size() / 2;
    int pivot = arr.get(pivotIndex);
    for (int n : arr) {
        if (n < pivot) {
            less.add(n);
        }
        else {
            more.add(n);
        }
    }

请勿在{{1​​}}或more列表中添加数据透视表。此外,您还可以了解如何选择变体here on the blog