Toggle menu
Toggle preferences menu
Toggle personal menu
Neprihlásený/á
Your IP address will be publicly visible if you make any edits.
Verzia z 17:21, 18. apríl 2025, ktorú vytvoril SKevo (diskusia | príspevky)

Triediace algoritmy Bubble-sort, Selection-sort, Insertion-sort, Quick-sort, Radix-sort, Merge-sort, Heap-sort, Counting-sort, pojmy inverzia a výpočtová zložitosť problému.


Triediace algoritmy

Častým problémom v algoritmizácií je efektívne (rýchle a pamäťovo nenáročné) triedenie množiny údajov, hľadanie najväčšieho a najmenšieho čísla (respektíve, maximálnej a minimálnej hodnoty), hľadanie mediánu (prostrednej hodnoty) a modusu (hodnoty s najčastejším výskytom) a podobne.

Majme napríklad množinu čísiel: {5, 2, 10, 1, 6}. Ako naprogramovať algoritmus ktorý takúto množinu usporiada od najmenšieho čísla po najväčšie? Touto otázkou sa zaoberali už tvorcovia algoritmov pred nami, a v súčasnosti existuje hneď niekoľko algoritmov. Každý algoritmus má svoju výpočtovú zložitosť – niektoré sú efektívnejšie pri menšom počte vstupných hodnôt, iné sú zamerané pre triedenie veľkého množstva hodnôt. Neexistuje teda definitívna odpoveď pre to, ktorý algoritmus je najlepší (ale samozrejme vo všeobecnosti vždy hľadáme algoritmus s najmenšou zložitosťou, či už časovou alebo pamäťovou).

V príklade vyššie sú uvedené čísla, ale samozrejme triedenie môžeme realizovať nad všetkým čo má pre nás nejakú postupnosť (napríklad: abecedný zoznam, zoradiť veľkosti objektov od najväčšieho po najmenší, spektrum farieb, triedenie dátumov a podobne). Neexistuje algoritmus ktorý dokáže realizovať triedenie súčasne na všetkých možných množinách prvkov (napríklad, usporiadanie písmen na klávesnici je iné ako abecedná postupnosť tých istých písmen), preto tieto algoritmy väčšinou prispôsobujeme našim potrebám. No pre jednoduchosť budeme v našich algoritmoch triediť iba postupnosti čísiel.

Bubble-sort

Za asi najznámejší triediaci algoritmus sa považuje Bubble-sort ("bublinové triedenie"). Z implementačného hľadiska je to vcelku jednoduchý algoritmus, ktorého princíp spočíva v postupnej výmene prvkov s nesprávnym poradím, pričom každý prvok "vybublá" na správne miesto.

V príklade vyššie je na vstupe pole s 5 číslami. Algoritmus bubble sort obsahuje dva vnorené cykly:

  1. Vonkajší cyklus zabezpečuje prechod od posledného indexu poľa k prvému. Je to preto, že s každou iteráciou v tomto cykle je garantované, že sa usporiada práve jedno číslo ("vybublá", preto sa tento algoritmus nazýva bubble-sort). Je zbytočné kontrolovať čísla, ktoré už boli správne vytriedené – preto tento cyklus začína od konca a i sa s každou iteráciou znižuje.
  2. Vonkajší cyklus je ten, ktorý realizuje triedenie (porovnávanie dvoch susedných prvkov). Ak je prvý prvok väčší ako prvok ktorý nasleduje, tak sa vymenia. S každou iteráciou sa najväčšie prvky budú posúvať doprava, takže pole bude zoradené od najmenšieho po najväčší (vzostupne). Ak je potrebné čísla zoradiť naopak (od najväčšieho po najmenší, teda zostupne), tak stačí obrátiť znak porovnania (zmeniť podmienku na if pole[j] < pole[j + 1]).

Je to v podstate algoritmus, ktorý posúva maximálne prvky doprava (alebo doľava, ak triedime zostupne), čím sa prvky zotriedia ("vybublajú") na správne miesto.

Algoritmus bubble-sort má časovú výpočtovú zložitosť O(n2) (v najhoršom prípade), je to jeden z najmenej efektívnych algoritmov. Používame ho napríklad vtedy, keď:

  • Triedime menší počet hodnôt a teda takáto výpočtová zložitosť je pre nás akceptovateľná;
  • Nevieme naprogramovať niečo lepšie;

Na nasledujúcej úlohe si môžeme skúsiť bubble-sort naprogramovať v Pythone:

Selection-sort

Selection-sort (triedenie výberom) algoritmus vyberá z poľa prvkov najmenší prvok a presunie ho na začiatok.

Výpočtová zložitosť tohto algoritmu je O(n2). Vo všeobecnosti je rýchlejší ako bubble-sort, avšak pomalší ako insertion-sort.

Insertion-sort

Insertion-sort (triedenie priamym vkladaním) používa jednu časť triedeného poľa pre ukladanie už vytriedených hodnôt a druhú časť toho istého poľa pre hodnoty ktoré ešte nemajú správne poradie. Princíp je podobný ako pri selection-sorte.

Časová výpočtová zložitosť je O(n2). Avšak narozdiel od selection-sortu, rýchlosť insertion-sortu závisí od vstupného poľa – pre takmer utriedené pole prebehne veľmi rýchlo.

Quick-sort

Ako už napovedá názov, quick-sort je jeden z najrýchlejších triediacich algoritmov. Quick-sort funguje vo všeobecnosti takto:

  1. Z poľa hodnôt sa vyberie jeden prvok ako pivot;
  2. Zvyšok poľa sa zoradí tak, že hodnoty menšie ako pivot budú naľavo od neho a hodnoty väčšie ako pivot budú napravo;
  3. Pivot sa vymení s prvým prvkom v podmnožine s väčšími hodnotami tak, aby pivot spadol medzi menšie a väčšie hodnoty – to rozdelí pôvodné pole na dve podmnožiny, kde menšie prvky sú naľavo a väčšie napravo;
  4. Celý postup sa rekurzívne opakuje pre obe podmnožiny menších prvkov naľavo a väčších prvkov napravo. Ak nezostane žiadna podmnožina pre ďalšie triedenie, pole je zoradené a rekurzia sa ukončí (triviálny prípad).

Implementácia quick-sortu je komplexnejšia, preto pripájam už hotový algoritmus v Pythone:

Časová výpočtová zložitosť algoritmu quick-sort je v najhoršom prípade O(n×log2n), avšak v priemernom prípade je to iba Θ(n×log2n), preto je v priemere oveľa efektívnejší ako ostatné algoritmy a patrí medzi najrýchlejšie triediace algoritmy.