我正在尝试在ArrayList上实现QuickSort算法。但是,我得到了一个
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);
}
答案 0 :(得分:0)
如果您尝试将数组的块从fromIdx
排序到toIdx
,除非它在该块中,否则不应该查看元素0。但是你的实现确实如此。
你在中间的索引技巧也有点像..我强烈建议您为阵列剪切掉一些小纸片,并在一张纸上写下跟踪信息,以便跟踪算法。如果你在实际操作时看到它没有意义,那么它在计算机中也没有意义。持有实物纸张的行为可能看起来很愚蠢,但对于准确描述您正在做的事情有很大帮助。 (你可以更准确地看到你的代码实际上做了什么,你就越有可能弄清楚它是否做错了。)