快速排序中的stackoverflow错误

时间:2011-10-19 13:28:09

标签: java stack-overflow quicksort

所以我一直在努力实现一个快速排序,但它会产生一个stackoverflower错误,但我似乎无法找到原因。

有人可以帮助我吗?

public static int partition(int[] a, int p, int q){
    int i = 0;
    for (int j = p; j < q; ++j){
        if(a[j] <= a[q]){
            int tmp = a[j];
            a[j] = a[i];
            a[i] = tmp;
            i++;
        }
    }
    int tmp = a[i];
    a[i] = a[q];
    a[q] = tmp;
    return i;
}

public static void qsort(int[] a, int p, int q){
    if(p < q){
        int x = partition(a, p, q);
        qsort(a, p, x - 1);
        qsort(a, x + 1, q);
    }
}

public static void main(String args[]){
    int[] a = {4, 6, 2, 9, 8, 23, 0, 7};

    qsort(a, 0, a.length - 1);

    for(int i : a){
        System.out.print(i + " ");
    }
}

2 个答案:

答案 0 :(得分:2)

堆栈溢出错误意味着永远不会达到递归的停止条件,在这种情况下p < q永远不会成立。使用调试器,为该行设置断点,并查找使用相同参数重复递归调用qsort()的时间。

答案 1 :(得分:2)

有几个错误,但您遇到的一个错误是partition()i不限制在pq之间。您很快就会遇到p=2q=3i的最终值为1的情况。这导致无限递归,因为qsort()一直用相同的参数调用自己。