В том, что мне кажется обычной реализацией быстрой сортировки, программа состоит из подпрограммы разбиения и двух рекурсивных вызовов для быстрой сортировки этих (двух) разделов.
Таким образом, поток управления, в самом быстром и псевдо-эссе псевдокода, выглядит примерно так:
quicksort[list, some parameters]
.
.
.
q=partition[some other parameters]
quicksort[1,q]
quicksort[q+1,length[list]]
.
.
.
End
q - это "пивот" после разбиения. Этот второй вызов быстрой сортировки - тот, который будет быстро сортировать вторую часть списка, также использует q. Это то, что я не понимаю. Если «поток управления» сначала проходит первую быструю сортировку, q будет обновляться. Как тот же q будет работать во второй быстрой сортировке, когда приходит время выполнить вторые части всех этих разделов?
Я думаю, мое недоразумение проистекает из ограничений псевдокода. Есть детали, которые, вероятно, были опущены при выражении этой реализации алгоритма быстрой сортировки в псевдокоде.
Редактировать 1 Это похоже на мою проблему:
For[i = 1, i < 5, i = i + 1, Print[i]]
В первый раз мы получим i = 1, правда, i = 2, 1 . Даже если i был обновлен до 2, i по-прежнему равен 1 в теле (то есть Print [i] = 1). Этот «поток контроля» - это то, что я не понимаю. Где хранится значение i = 1, когда оно увеличивается до 2 и до того, как оно попадет в тело?
Редактировать 2
В качестве примера того, что я пытаюсь получить, я вставляю это здесь. Это отсюда.
Partition(A,p,r)
x=A[r]
i=p+1
j=r+1
while TRUE
repeat j=j-1
until A[j]<=x
repeat i=i+1
until A[i]>=x
if i<j
then exchange A[i] with A[j]
else return j
Quicksort(A,1,length[A])
Quicksort(A,p,r)
if p<r
then q=Partition(A,p,r)
Quicksort(A,p,q)
Quicksort(A,q+1,r)
Другой пример можно найти здесь.
Где или когда в этих алгоритмах q помещается в стек?