Zaradenie a popis
Quicksort alebo triedenie rozdeľovaním je jeden z najrýchlejších známych triediacich algoritmov, založených na porovnávaní
prvkov. Jeho priemerná doba výpočtu je O(n.logn) a je najlepšia zo všetkých podobných algoritmov. Jeho naprogramovanie
je aj celkom jednoduché. Nevýhodou je, že pri nevhodnom usporiadaní vstupných dát môže byť časová a pamäťová náročnosť tohto algoritmu
až O(n2).
Napriek tomu, že Quicksort nemá zaručenú časovú zložitosť O(n.logn), reálne aplikácie a testy ukazujú, že na
pseudonáhodných vstupných údajoch je najrýchlejší zo všetkých všeobecných triediacich algoritmov. To znamená rýchlejší ako Heapsort a Mergesort,
ktoré sú formálne rýchlejšie. Maximálna časová náročnosť O(n2) však nedovoľuje jeho použitie
v kritických aplikáciách.
Motivácia a špecifikácia
Máme v poli uloženú postupnosť prvkov. Cieľom je usporiadať túto postupnosť vzostupne v priemernom čase O(n log n).
Vstup: pole A, ktoré je naplnené náhodnými hodnotami
Výstup: utriedené pole A
Myšlienka algoritmu
Quicksort je algoritmus používajúci techniku divide and conquer. Rozdeľuje pole nasledujúcim spôsobom: vyberie sa jeden
prvok nazývaný pivot a presunú sa všetky prvky menšie ako pivot naľavo od neho a všetky prvky väčšie ako pivot napravo.
Potom tento proces rekurzívne spustíme na pravej a ľavej časti poľa. Algoritmus končí vnáranie vtedy, keď dostane utriediť podpole
veľkosti 2 (prípadne 1) a začína sa vynárať. Keď sa vynoria všetky vnorenia rekurzie, je pole utriedené.
Proces výmeny prvkov je možné robiť efektívne v lineárnom čase a na mieste. Keď je vybraný medián x, prehľadávajú sa
prvky zľava, pokiaľ sa nenájde prvok a>x, potom sa prehľadávajú prvky sprava, pokiaľ sa nenájde
prvok b<x. Tieto prvky sa vymenia a pokračuje proces prehľadávania a výmeny, pokiaľ sa pravé a ľavé prehľadávania nestretnú.
Vizualizácia
Zápis algoritmu
procedure quicksort (l,r : integer);
var i,j,x,w : integer;
begin
i:=l; j:=r;
x:=akt[(l+r) div 2];
repeat
while akt[i] < x do i:=i+1;
while x < akt[j] do j:=j-1;
if i <= j then begin
w:=akt[i];
akt[i]:= akt[j];
akt[j]:=w;
i:=i+1; j:=j-1
end
until i > j;
if l < j then quicksort(l,j);
if i < r then quicksort(i,r)
end;
^ TOP
Vlastnosti algoritmu
Čas behu algoritmu je v priemernom prípade O(n log n). Dobrá časová zložitosť algoritmu spočíva v správnom výbere pivota.
V ideálnom prípade je to medián (alebo hodnota blízka mediánu).Ak však je pivot zakaždým minimum alebo maximum daného
podpoľa, časová zložitosť narastá na O(n2).
Preto je vhodné použiť na výber pivota jednu z nasledujúcich techník:
a) Náhodný prvok – často používaná metóda. Ak ide o naozaj náhodný výber, čas triedenia
je O(n log n).
b) Metóda mediánu z troch čísel (prípadne z ľubovolného konštantného počtu) – vyberú sa z množiny tri prvky,
z ktorých sa nájde medián a ten sa zvolí za pivota.
Qucksort nie je stabilné triedenie a triedi prvky in-situ.
Experimentovanie
Department of Computer Science, University of British Columbia, Canada
Java applety rôznych triediacich algoritmov.
http://www.cs.ubc.ca/spider/harrison/Java/sorting-demo.html
College of Engineering, The University of Texas, USA
Quicksort spracovaný do java appletu.
http://www-cse.uta.edu/~holder/courses/cse2320/lectures/applets/quicksort/