Ниже перечислены функции быстрого сортировки. Здесь мы берем последний элемент в качестве стержня.Как работает рекурсия Quick sort?
Я понял функцию 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);
}
}
Первый (левый, левый, левый, левый, правый). Первый рекурсивный вызов 'qs' находится в левом разделе массива. Рекурсивный вызов правого раздела массива не будет выполняться до тех пор, пока первый вызов не вернется, т. Е. До тех пор, пока левый раздел не будет полностью отсортирован. Другой способ взглянуть на это состоит в том, что вы выполняете обход глубины дерева рекурсии. – beaker
@beaker После первого раздела слева снова разворачивается снова и снова влево, но как насчет правой части раздела левой части (второй раздел слева, справа)? – neOh
@beaker Кроме того, после того, как левая сторона (1-я секция) будет отсортирована, тогда при сортировке правой части qs (a, pi + 1, end) не будет левая функция qs (a, start, pi- 1) также можно назвать? Разве правая сторона (1-й раздел) не будет сортироваться по другому процессу, кроме левой? – neOh