Counting sort

z Wikipédie, slobodnej encyklopédie

Counting sort je triediaci algoritmus, ktorý v lineárnom čase utriedi prvky v konečnej množine. Všetky prvky sú celé čísla z intervalu <0; k-1> pre .[1]

Algoritmus[upraviť | upraviť zdroj]

Pre každý prvok x vo vstupnej množine sa určí počet prvkov, ktoré sú rovné ako daný prvok x. Tento údaj sa uloží do pomocného poľa. Ku každej položke v pomocnom poli sa následne pripočíta počet výskytov predchádzajúcich položiek. Takýmto spôsobom sa získa presná pozícia hranice, ktorá sa využije na priame umiestnenie prvku x vo výstupnom zoradenom poli. Algoritmus začne sprava prechádzať neutriedené prvky vo vstupnom poli a pre každý prvok sa pozrie na jeho hornú hranicu, ktorú má uloženú v pomocnom poli. Na túto pozíciu ho uloží do výstupného poľa a následne toto číslo zníži o 1. Obdobným spôsobom prejde celé vstupné pole sprava doľava a výstup – utriedené prvky - sa budú nachádzať vo výstupnom poli.

Pseudokód
Pole A - vstupná množina
Pole B - výstup (utriedená množina)
Pole C - pomocné pole, v ktorom sa ukladá počet výskytov vstupných prvkov

procedure Counting_Sort;
begin
  for i := 0 to k do 
    C[i] := 0; //inicializácia poľa C na 0
  for j := 1 to length(A) do 
    C[A[j]] := C[A[j]] + 1;  // C[i] teraz obsahuje počet výskytov prvku i v poli A
  for i := 1 to k do 
    C[i] := C[i] + C[i  1]; // C[i] teraz obsahuje počet prvkov menších alebo rovných ako i
  for j := length(A) downto 1 do
  begin
    B[C[A[j]]] := A[j]; // B je utriedená množina
    C[A[j]] := C[A[j]]  1;
  end;
end;


Príklad[upraviť | upraviť zdroj]

Majme vstupnú množinu prvkov [3,1,5,2,1,5,1].
Do pomocného poľa si uložíme počet výskytov jednotlivých prvkov

1 – 3x
2 – 1x
3 – 1x
5 – 2x

Prepočítame ich na hranice prvkov:

1 – 3
2 – 4  (tri výskyty prvku 1 a jeden výskyt prvku 2)
3 – 5
5 – 7

Zaradenie prvého prvku (ideme sprava doľava)

[ , ,1, , , , ]

Upravíme pomocné pole a hranice prvkov:

1 – 2x (hranica:2)
2 – 1x (hranica:4)
3 – 1x (hranica:5)
5 – 2x (hranica:7)

Zaradenie ostatných prvkov (analogicky)

[ , ,1, , , ,5]
[ ,1,1, , , ,5]
[ ,1,1,2, , ,5]
[ ,1,1,2, ,5,5]
[1,1,1,2, ,5,5]
[1,1,1,2,3,5,5]
[1,1,1,2,3,5,5]

Vlastnosti[upraviť | upraviť zdroj]

Časová zložitosť: Inicializácia poľa C – nastavenie prvkov na 0 a jeden ďalší prechod týmto poľom trvajú O(k), algoritmus prejde navyše dvakrát pole A, to trvá O(n). Takto je celkový beh v čase O(n + k).[2] Za predpokladu, že rozsah 1..k nie je väčší než n, teda možno uvažovať, že k = O(n) a teda je potom celkový čas behu countingsortu O(n). [3]

Pamäťová zložitosť: Counting sort využíva polia dĺžok k+1 a n. Celková pamäťová zložitosť preto je O(n + k).[2]. Za rovnakého predpokladu, ako je uvedený pri časovej zložitosti, je pamäťová zložitosť O(k).

Stabilita: Countingsort je stabilné triedenie. Znamená to, že prvky rovnakej hodnoty na vstupe budú v rovnakom poradí na výstupe. Je to z toho dôvodu, že nie je založený na porovnaní. Avšak keby sme pole začali triediť smerom zľava doprava, výsledná množina by nebola stabilná.

Referencie[upraviť | upraviť zdroj]

  1. EDMONDS, Jeff. How to Think about Algorithms. [s.l.] : Cambridge University Press, 2008. ISBN 978-0-521-84931-9. Kapitola 5.2 Counting Sort (a Stable Sort), s. 72–75. (po anglicky).
  2. a b CORMEN, Thomas H.; LEISERSON, Charles E.; RIVEST, Ronald L., ai. Introduction to Algorithms. MIT Press and McGraw-Hill, 2001. (2nd.) Kapitola 8.2 Counting Sort, s. 168–170. ISBN 0-262-03293-7. (po anglicky)
  3. ZEMIANEK, Juraj. Triediace algoritmy (Bakalárska práca). Bratislava: 2007.

Iné projekty[upraviť | upraviť zdroj]

Externé odkazy[upraviť | upraviť zdroj]