我正在针对仅增加整数的数组进行快速排序问题。此例程中的数据透视选择始终是子数组的第一个元素(由问题决定),并且在某个时刻我预计这将导致StackOverflowError。奇怪的是,它对于大小为n = ~25,000到~404,300的问题不起作用,但它比n大得多。即使我对数组的输入进行播种,它也会波动到有时n = 10,000,有时无法工作。
以下是我得到的一些结果(时间以秒为单位):
10,000:.077
20,000:.282
~25,000 - ~404,300:SOE
405,000 - 3.169
410,000 - 1.632
450,000 - .098
500,000 - .059
5,000,000 - .634
10,000,000 - 1.337
100,000,000 - 18.613
任何想法会导致什么?代码如下。
提前致谢。
public static void main(String[] args) {
int arraySize = 1000000;
int[] a = new int[arraySize];
Random gen = new Random();
gen.setSeed(0);
a[0] = gen.nextInt(arraySize * 10);
for (int i = 1; i < arraySize; i++) {
a[i] = a[i - 1] + gen.nextInt(arraySize / 10);
}
private static void quickSort(int[] a, int lo, int hi) {
if (hi <= lo) return;
int j = partition(a, lo, hi);
quickSort(a, lo, j - 1);
quickSort(a, j + 1, hi);
}
private static int partition(int[] a, int lo, int hi) {
int i = lo, j = hi + 1;
int pivot = a[i];
while (true) {
while (a[++i] > pivot) if (i == hi) break;
while (pivot > a[--j]) if (j == lo) break;
if (i >= j) break;
int temp = a[i];
a[i] = a[j];
a[j] = temp;
}
int temp = a[lo];
a[lo] = a[j];
a[j] = temp;
return j;
}
答案 0 :(得分:0)
我认为你的分区方法不正确(但我错了,我只是略过了代码),所以数据没有正确分区,导致更多的递归调用导致堆栈溢出。
我建议你在quicksort方法中添加一个打印行,打印出它的参数,这样你就可以将它转换为行图,其中X值是调用号(即第1行是第一次调用,行2用于下一个调用等),画一条线(X,Y1) - (X,Y2),其中Y1是第一个值,Y2是第二个。
我的猜测是你现在很容易看到出了什么问题(或许可以降低排序量)。