有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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

这就是我在线程“main”java中得到的错误:Exception。StackOverflowerr语言

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

}


共 (2) 个答案

  1. # 1 楼答案

    考虑如果你选择最小的元素作为你的支点会发生什么。两个子列表中的一个子列表将为空,而另一个子列表将包含整个原始列表,从而导致无限递归

  2. # 2 楼答案

    问题可能在这里:

    您选择的轴心点为:

    l.get(0);
    

    然后再次添加轴:

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

    从零开始

    因此,将其更改为从1开始:

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

    编辑: 另一个错误是在join()方法中-两个ArrayList都必须从0开始:

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