使用 Arraylist 进行快速排序的 Java 实现疑难解答

标签 java sorting recursion arraylist quicksort

我正在尝试使用 ArrayList 实现快速排序算法,但似乎无法正常工作。它为我在 sort() 函数中的递归返回调用提供了一个错误。请帮忙!

这是我得到的错误:线程“main”中的异常 java.lang.StackOverflowError

    public static void main(String[] args) {

    List<Integer> l = new ArrayList<Integer>();
    l.add(10); l.add(7); l.add(13); l.add(22); l.add(9);
    //l.get(2);


    System.out.println(sort(l));


}


public static List<Integer> sort(List<Integer> l) {

    if (l.size() <= 1) {
        return l;
    }

    int pivot = l.get(0);
    List<Integer> left = new ArrayList<Integer>();
    List<Integer> right = new ArrayList<Integer>();

    for (int i = 0; i < l.size(); i++) {
        if (l.get(i) < pivot) {
            left.add(l.get(i));
            //System.out.println(left);
        } else {
            right.add(l.get(i));
        }

    }
    return join(sort(left), sort(right), pivot);
}

public static List<Integer> join(List<Integer> left, List<Integer> right, int pivot) {

    List<Integer> l =  new ArrayList<Integer>();

    for (int i = 0; i < left.size(); i++) {
        l.add(left.get(i));
    }

    l.add(pivot);

    for (int i = l.size(); i < right.size(); i++) {
        l.add(right.get(i));
    }
    return l;
}

}

最佳答案

问题可能出在这里:

您选择的枢轴为:

l.get(0);

然后再次添加数据透视表:

int i = 0; i < l.size(); i++

从零开始!

所以将其改为从1开始:

int i = 1; i < l.size(); i++

编辑: 另一个错误是在您的 join() 方法中 - 两个数组列表都必须从 0 开始:

for (int i = 0; i < right.size(); i++) {
        l.add(right.get(i));
}

关于使用 Arraylist 进行快速排序的 Java 实现疑难解答,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21665058/

相关文章:

java - 在 Intellij Idea 中使用 sbt 进行构建和导入时出现 NoClassDefFoundError

java - SWT 样式文本部分重画

algorithm - 你将如何对 30gb 文件进行排序,其中重复包含 1 - 1000 个数字

c++ - 拜特兰金币

c - Haskell - 相当于 for 循环?

java - 始终避免 Java 中的递归方法?

java - 从 servlet API 设置时是否需要转义 cookie 值?

java - ORMLite 混合 orderBy() 和 orderByRaw()

c - 并行冒泡排序被阻止

arrays - 算法:在$ O(n\log n)$中使用中位数和Just 1比较排序