【问题标题】:StackOverflowError while implementing QuickSort实现快速排序时出现 StackOverflowError
【发布时间】:2013-10-27 02:32:53
【问题描述】:

我正在尝试在 ArrayList 上实现快速排序算法。但是,我得到了一个

Exception in thread "main" java.lang.StackOverflowError
    at sorting.QuickSort.quickSort(QuickSort.java:25)
    at sorting.QuickSort.quickSort(QuickSort.java:36)
    at sorting.QuickSort.quickSort(QuickSort.java:36)
    at sorting.QuickSort.quickSort(QuickSort.java:36)
    at sorting.QuickSort.quickSort(QuickSort.java:36)
    ...

我不确定为什么会出现溢出。下面是我的实现:

public static void quickSort(ArrayList<Integer> al, int fromIdx, int toIdx) {
    int pivot, pivotIdx;

    if (fromIdx < toIdx) {
        pivot = al.get(fromIdx);
        pivotIdx = fromIdx;

        for (int i = 0; i != (fromIdx + 1); i++) {
            if (al.get(i) <= pivot) {
                pivotIdx += 1;
                swap(al, pivotIdx, i);
            }
        }

        swap(al, fromIdx, pivotIdx);
        quickSort(al, fromIdx, pivotIdx - 1);
        quickSort(al, pivotIdx + 1, toIdx);
    }
}

public static void swap(ArrayList<Integer> al, int xIdx, int yIdx) {
    Integer temp = al.get(xIdx);
    al.set(xIdx, al.get(yIdx));
    al.set(yIdx, temp);
}

【问题讨论】:

  • 不看你的代码,这听起来像是计算递归索引值的错误。在调试器中运行并确保您不会被卡住的索引对绊倒。
  • 它说第36行有错误但它没有写也你没有写main方法
  • toIdx 在调用quickSort 中的作用是什么?递归排序的索引范围是多少? for循环中i的取值范围是多少?

标签: java algorithm stack-overflow quicksort


【解决方案1】:

如果您尝试将数组的块从fromIdx 排序到toIdx,则永远不要查看元素 0,除非它在该块中。但你的实现确实如此。

你在中间的索引技巧也有点..奇怪。我强烈建议您练习为数组剪下小纸片,并在一张纸上写下跟踪信息,以便您可以跟踪算法。如果你在实际操作时发现它没有意义,那么它在计算机中也没有意义。拿着纸片的行为可能看起来很傻,但对于准确地想象你在做什么很有帮助。 (您越能准确地可视化您的代码实际执行的操作,您就越有可能弄清楚它是否做错了。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-09
    • 2016-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多