QuickSort

Z CHWiki

Přejít na: navigace, hledání

[editovat] Popis

Quick sort je v praxi asi najpoužívanejší triediaci algoritmus, kvôli jeho veľkej efektívnosti, jeho časová zložitosť v najhoršom prípadě je O(n2), v priemeru má ale zložitost O(n.log(n)) (pokud je pivot volen zcela náhodne). Je to rekurzívny algoritmus a je veľmi jednoduché ho implementovať. Z poľa sa vyberie jeden prvok (bude sa nazývať pivot) a všetky prvky, ktoré sú menšie od pivota, sa dajú naľavo a všetky väčšie prvky sa dajú napravo (pivot je po tomto na mieste, na ktorom bude aj na konci, keďže napravo sú všetky prvky väčšie a pri dalšom triedení sa nemajú ako dostať naľavo, to isté platí o prvkoch naľavo). Potom sa toto rekurzívne spraví aj pre všetky prvky naľavo od pivota a potom pre všetky prvky napravo od pivota.

[editovat] Príklad

Nasledujúci príklad pracuje inak ako program za ním, ale ukazuje jasnejšie princíp quick sortu. Zvýraznené čísla sú pivoty (všimnite si, že v druhom riadku každého kroku sú pred pivotom menšie čísla a za pivotom väčšie. Znakom x sú označené miesta, kde boli v niektorom z predchádzajúcich krokov pivoty a teda miesta, kde sú už umiestnené správne čísla.

pole pred triedením
  6 8 4 5 2 3 1 7 0 9
 
1. krok
  6 8 4 5 2 3 1 7 0 9	
  4 5 2 3 1 0 6 8 7 9	  
  
2.krok
  4 5 2 3 1 0 x 8 7 9
  2 3 1 0 4 5 x 7 8 9
  
3. krok	
  2 3 1 0 x 5 x 7 x 9
  1 0 2 3 x 5 x 7 x 9

4. krok 
  1 0 x 3 x x x x x x
  0 1 x 3 x x x x x x

5. krok 
  0 x x x x x x x x x
  0 x x x x x x x x x

výsledok
  0 1 2 3 4 5 6 7 8 9 


[editovat] Implementácia

function quickSort(pole, lavy, pravy)
    if lavy < pravy
        pivot := lavy
        for i := lavy + 1 to pravy
            if pole[i] < pole[lavy] 
                pivot := pivot + 1
                swap(pole[pivot], pole[i])
            end if
        end for
        swap(pole[pivot], pole[lavy])
        quickSort(pole, lavy, pivot)
        quickSort(pole, pivot + 1, pravy)
    end if
end function


Výsledná efektívnosť algoritmu závisí predovšetkých od voľby pivota, najčastejšie sa používa ľavý alebo pravý prvok. Efektívnejšie je ako pivot zvoliť medián ľavého, stredného a pravé prvku. Žiadne riešenie však nie je dokonalé.