Counting sort
Da Wikipedia, l'enciclopedia libera.
Il Counting sort è un algoritmo di ordinamento per valori numerici interi con complessità lineare. L'algoritmo si basa sulla conoscenza a priori dell'intervallo in cui sono compresi i valori da ordinare.
Indice |
[modifica] Descrizione intuitiva
L'algoritmo conta il numero di occorrenze di ciascun valore presente nell'array da ordinare, memorizzando questa informazione in un array temporaneo di dimensione pari all'intervallo di valori. Il numero di ripetizioni dei valori inferiori indica la posizione del valore immediatamente successivo.
Si calcolano i valori massimo, max(A), e minimo, min(A), dell'array e si prepara un array ausiliario C di dimensione pari all'intervallo dei valori con C[i] che rappresenta la frequenza dell'elemento i + min(A) nell'array di partenza A. Si visita l'array A aumentando l'elemento di C corrispondente. Dopo si visita l'array C in ordine e si scrivono su A, C[i] copie del valore i + min(A).
[modifica] Complessità
L'algoritmo esegue due iterazioni, una di lunghezza n per il calcolo delle occorrenze dei valori e una di lunghezza m per la l'impostazione delle posizioni finali dei valori. La complessità totale è quindi O(n + m), dove n è la lunghezza dell'array da ordinare e m è pari a max(A) − min(A) + 1 (max(A) e min(A) sono rispettivamente l'elemento più grande e l'elemento più piccolo dell'array) ovvero è il range dei valori contenuti nell'array.
Non è basato su confronti e scambi e conviene utilizzarlo quando il valore di m è O(n), nel qual caso l'algoritmo è O(n), altrimenti risulterebbero più veloci altri algoritmi.
[modifica] Pseudocodice
countingSort(A[])
//Cacolo degli elementi max e min
max ← A[0]
min ← A[0]
for i ← 1 to length[A] do
if (A[i] > max) then
max ← A[i]
else if(A[i] < min) then
min ← A[i]
//Costruzione dell'array C
* crea un array C di dimensione max - min + 1
for i ← 0 to length[C] do
C[i] ← 0 //inizializza a zero gli elementi di C
for i ← 0 to length[A] do
C[A[i] - min] = C[A[i] - min] + 1 //aumenta il numero di volte che si è incontrato il valore
//Ordinamento in base al contenuto dell'array delle frequenze C
k ← 0 //indice per l'array A
for i ← 0 to length[C] do
while C[i] > 0 do //scrive C[i] volte il valore (i + min) nell'array A
A[k] ← i + min
k ← k + 1
C[i] ← C[i] - 1
[modifica] Bibliografia
- Thomas Cormen; Charles E. Leiserson, Ronald Rivest. Sorting in Linear Time in Introduction to Algorithms . 20a ed. Cambridge, Massachussetts, The MIT Press, 1998. pp. 175-177
[modifica] Altri progetti
Wikibooks contiene implementazioni di Counting sort
| Algoritmi di ordinamento | ||
|---|---|---|
| Teoria | Teoria della complessità computazionale | Notazione O Grande | Lista | Stack | Coda | |
| Algoritmi a scambio | Bubble sort | Cocktail sort | Comb sort | Gnome sort | Quicksort | |
| Algoritmi di selezione | Selection sort | Heapsort | Smoothsort | |
| Algoritmi ad inserimento | Insertion sort | Shell sort | Tree sort | Library sort | Patience sorting | |
| Algoritmi a fusione | Merge sort | |
| Algoritmi non comparativi | Radix sort | Bucket sort | Counting sort | Pigeonhole sort | |
| Altri algoritmi | Stupid sort | |

