【问题标题】:Java implementation of Quicksort with Arraylist Troubleshooting使用 Arraylist 故障排除的快速排序的 Java 实现
【发布时间】:2014-02-09 21:08:56
【问题描述】:

我正在尝试使用 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;
}

}

【问题讨论】:

  • 它会给你什么错误?
  • @CraigOtis 线程“main”中的异常 java.lang.StackOverflowError
  • 我认为这是一个学习使用调试器的好机会!
  • 你试过调试你的排序方法吗?在实现分而治之的搜索算法时,堆栈溢出通常是一个错误,您使用相同的参数重复调用 sort() 方法,通常是在您接近递归的“叶子”时。

标签: java sorting recursion arraylist quicksort


【解决方案1】:

问题大概出在这里:

你选择你的支点为:

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

【讨论】:

  • 或者 - 在分配枢轴时使用l.remove(0),并且不理会循环。 (除非您不想更改提供的List。)
  • 我将计数器改为 1,结果得到 [7, 10]
  • @CraigOtis 我认为这不是更好的解决方案,因为 remove() 第一个元素可能具有 O(n) 复杂度..
  • @KubaSpatny - 谢谢!做到了!
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2014-01-07
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 2023-03-11
    • 1970-01-01
    • 2018-12-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多