ошибка переполнения стека в быстрой сортировке - PullRequest
3 голосов
/ 19 октября 2011

Итак, я сам пытался реализовать быструю сортировку, но она генерирует стекозаборник, но я не могу найти причину.

Может ли кто-нибудь мне помочь?

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 ]

2 голосов
/ 19 октября 2011

Есть несколько ошибок, но вы сразу же сталкиваетесь с тем, что в partition(), i не обязательно находится между p и q. Вы довольно быстро попадаете в ситуацию, когда p=2, q=3, но окончательное значение i равно 1. Это приводит к бесконечной рекурсии, поскольку qsort() продолжает вызывать себя с одинаковыми аргументами.

2 голосов
/ 19 октября 2011

Ошибка переполнения стека означает, что условие остановки рекурсии никогда не достигается, в этом случае p < q никогда не выполняется. Используйте отладчик, установите точку останова для этой строки и найдите, когда qsort() повторно вызывается рекурсивно с теми же параметрами.

...