Zaradenie a popis
Counting sort je triediaci algoritmus, ktorý pracuje v čase O(n). Nie je to teda triedenie porovnávaním. Využíva to, že dopredu sa vie rozsah čísel v poli A, ktoré sa má triediť. Používa pomocné pole C, ktoré je veľké podľa tohto rozsahu (to znamená maximálna hodnota mínus minimálna hodnota plus jedna). Týmto sa algoritmus stáva nepraktickým pre veľké rozsahy čísel kvôli narastajúcej časovej a pamäťoje zložitosti. Counting sort je vhodný napríklad na triedenie čísel z rozsahu od 0 do 100, ale nie je vhodný na abecedné utriedenie menného zoznamu. Môže však byť vhodne použitý v algoritme triedenia Radix sort, keď je tento rozsah príliš veľký na triedenie priamo Counting sortom.
^ TOPMyšlienka algoritmu
Vytvorí sa pole C, ktorého veľkosť je od minima po maximum triedeného poľa A. V prípade,
že je možná len pevná indexácia (napríklad so začiatkom len v 0), musia byť hodnoty z A mapované na C.
Ak ide len o funkciu, kde sa od každého prvku odčíta minimum poľa A, aby sa získal zodpovedajúci index v poli C,
triedenie sa volá Counting sort (ak sa prvky mapujú zložitejšou funkciou, algoritmus triedenia je Bucket sort).
Ak priamo nepoznáme maximum a minimum, je potrebné tieto hodnoty zistiť jedným prechodom poľa A.
Každý index i v poli C je nasledovne použitý na spočítanie koľko prvkov
poľa A má hodnotu menšiu ako i. Počty uložené v C sú potom použité na vloženie
prvkov do A na svoje správne pozície, čím dostaneme utriedené pole.
Vizualizácia
Zápis algoritmu
countingsort(A[], B[], k)
for i = 1 to k do
C[i] = 0
for j = 1 to length(A) do
C[A[j]] = C[A[j]] + 1
for 2 = 1 to k do
C[i] = C[i] + C[i-1]
for j = 1 to length(A) do
B[C[A[j]]] = A[j]
C[A[j]] = C[A[j]] - 1
^ TOP
Vlastnosti algoritmu
Counting sort má časovú zložitosť Theta(n+k), kde n a
k sú dĺžky polí A (vstupné pole) a C
(pomocné spočítavacie pole). Aby bol algoritmus efektívny, nesmie byť k v porovnaní s n
príliš veľké. Ak k je O(n), tak je čas behu algoritmu Theta(n).
Counting sort je stabilný triediaci algoritmus, ale netriedi prvky na mieste.
Experimentovanie
School of Computer Science, Cardiff University, UK
Demonštrácia vlastností counting sortu.
http://users.cs.cf.ac.uk/C.L.Mumford/tristan/CountingSort.html
Computer Science and Engineering Department, Indian Institute of Technology, India
Animácia counting sortu s možnosťou krokovania.
http://www.cse.iitk.ac.in/users/dsrkg/cs210/applets/sortingII/countingSort/countingSort.html