Quicksort StackOverflowError不一致

时间:2011-03-06 20:15:47

标签: java quicksort stack-overflow

我正在针对仅增加整数的数组进行快速排序问题。此例程中的数据透视选择始终是子数组的第一个元素(由问题决定),并且在某个时刻我预计这将导致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;
}

1 个答案:

答案 0 :(得分:0)

我认为你的分区方法不正确(但我错了,我只是略过了代码),所以数据没有正确分区,导致更多的递归调用导致堆栈溢出。

我建议你在quicksort方法中添加一个打印行,打印出它的参数,这样你就可以将它转换为行图,其中X值是调用号(即第1行是第一次调用,行2用于下一个调用等),画一条线(X,Y1) - (X,Y2),其中Y1是第一个值,Y2是第二个。

我的猜测是你现在很容易看到出了什么问题(或许可以降低排序量)。