# QSort Rekurencyjny QuickSort ```=1 PROCEDURE Quicksort(tablica, l, r) IF l < r THEN { jeśli fragment dłuższy niż 1 element } i := PodzielTablice(tablica, l, r); { podziel i zapamiętaj punkt podziału } Quicksort(tablica, l, i-1); { posortuj lewą część } Quicksort(tablica, i+1, r); { posortuj prawą część } ``` Iteracyjny QuickSort. Zamiast wywołań rekurencyjnych spamiętujemy dane na stosie. ```=1 PROCEDURE Quicksort(tablica, l, r) Stos.Dodaj(l,r) WHILE l < n-1 IF l < r THEN { jeśli fragment dłuższy niż 1 element } l,r := Stos.Zdejmij() i := PodzielTablice(tablica, l, r); { podziel i zapamiętaj punkt podziału } Stos.Dodaj(i+1,r) Stos.Dodaj(l,i-1) ``` Iteracyjny QuickSort w stałej dodatkowej pamięci. Zamiast pamiętać granice przedziału na stosie, zaznaczamy je odpowiednimi wartownikami - pivotami. ```=1 PROCEDURE Quicksort(tablica, l, r) { pierwsza iteracja jest inna } posortowane := 0 i := PodzielTablice(tablica, l, r) Zamień(l,i) { postaw wartownika } { główna pętla } WHILE posortowane < n-1 { zamiast zdejmowania ze stosu } l := posortowane r := Pierwszy element i, t.ż. l <= i oraz A[i-1] <= A[l] <= A[i+1] { w i był pivot, którego przestawiliśmy } Zamień(l,r) { cofnij "stawianie wartownika" } --r IF l < r THEN { jeśli fragment dłuższy niż 1 element } i := PodzielTablice(tablica, l, r); { podziel i zapamiętaj punkt podziału } { zamiast wrzucania na stos } Zamień(i,r) { postaw wartownika } ELSE { fragment długości 0 lub 1 } posortowane++ ```