---
# System prepended metadata

title: QSort

---

# 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++
```