Как работает рекурсия быстрой сортировки?

Приведенные ниже функции являются реализацией быстрой сортировки. Здесь мы берем последний элемент в качестве оси.

Я поняла partition функция (где ось приходит в свою сортированную позицию), но я не могу понять рекурсивную функцию qs, Функция qs вызывает себя рекурсивно, чтобы решить левую сторону qs(a,start,pi-1) и право раздела по qs(a,pi+1,end),

Делает ли это решение слева, а затем (слева от слева), затем (слева от (слева от слева) и т. Д., А затем влево, влево... вправо и т. Д. Или чередуется, решая слева сторона, а затем правая сторона.

PS: я хочу знать, что происходит внутри компьютера, механизм этой рекурсии быстрой сортировки. Программа работает, но я хочу знать, как она работает.

int partition(int *a, int start, int end)
{   
    int pivot=a[end];
    int pi=start;
    for(int i=start; i<end; i++)
    {
        if(a[i]<=pivot)
        {
            swap(a[i],a[pi]);
            pi++;
        }
    }
    swap(a[pi], a[end]);
    return pi;
}

void qs(int*a, int start, int end)
{
    if(start<end)
    {
        int pi=partition(a,start,end);
        qs(a,start,pi-1);
        qs(a,pi+1,end);
    }
}

2 ответа

Пример порядка операций для схемы разбиения Lomuto, где pivot = array[high].

быстрая сортировка (массив, низкий уровень, пивот-1), быстрая сортировка (массив, главный уровень +1, высокий уровень).

Вертикальная черта, используемая для отображения левого подмассива, оси вращения, правого подмассива.

  11 13 14 12 10  8  9  5  6  4  2  0  1  3  7
   5  6  4  2  0  1  3 11 13 14 12 10  8  9  7 
   5  6  4  2  0  1  3| 7|13 14 12 10  8  9 11
   2  0  1  5  6  4  3 
   2  0  1| 3| 6  4  5
   0  2  1 
   0| 1| 2
               4  6  5
               4| 5| 6
                          10  8  9 13 14 12 11
                          10  8  9|11|14 12 13
                           8 10  9
                           8| 9|10
                                      12 14 13
                                      12|13|14
   0  1  2  3  4  5  6  7  8  9 10 11 12 13 14

Лучший способ понять порядок, в котором происходят события, которые я могу вам предложить, - это распечатать некоторую отладочную информацию на вашем компьютере. qs метод. Для этого я добавил бы дополнительный аргумент ref, в котором я бы посчитал, сколько раз qs вызывается функция и выводит эту информацию рядом с границами решаемого раздела. например

void qs(int*a, int start, int end, int &stepCount)
{
    if(start<end)
    {
        int currentStep = stepCount++;
        cout << "Solving step " << currentStep << " partition from " << start << " to " << end << endl;
        int pi=partition(a,start,end);
        qs(a,start,pi-1,stepCount);
        qs(a,pi+1,end,stepCount);
        cout << "Finished solving step " << currentStep << endl;
    }
}

Не понимаю ваш вопрос PS. Это очень широко. Вы имеете ввиду конкретно в разделе? Как обрабатывается рекурсия? Как биты перемещаются в памяти?

Другие вопросы по тегам