Counting sort
Il counting sort fa parte degli algoritmi di sorting. in tempo e spazio
Input Sequenza di valori interi tali che .
Output Permutazione della sequenza tale che
title: Attenzione
Non su effettuano confronti tra gli elementi di A.- Si crea un array di appoggio di lunghezza , con numero più alto contenuto nell’array
- Si cicla su A e si inserisce il conteggio di ogni valore nell’array di appoggio
- Genero la sequenza appropriata partendo dall’array di appoggio
CountingSort(A, k)
n := A.length
B := [0..k]
// inizializzo array B
for i = 0 to n-1 do
B[i] = 0
for i = 0 to n-1 do
B[A[i]] = B[A[i]] + 1
j := 0
for i = 0 to k-1 do
while B[i] > 0 do
A[j] := i
j := j + 1
C[i] := C[i] - 1
Il costo computazionale è molto basso, perché e come lower bound: .
Lo spazio occupato per l’array di appoggio è di .
Questo algoritmo non è stabile! Gli elementi presenti nell'array finale non sono uguali a quelli di partenza.Bisogna stare attenti all’ordine di grandezza di .
- Se
Best use: meglio usare questo algoritmo quando o ancora meglio quando .
Versione stabile
La versione stabile utilizza due array di appoggio:
- B: similmente alla versione precedente, per tenere il conto degli elementi
- C: per copiare gli elementi di A ordinatamente, e poi ricopiarli dentro A
CountingSort(A, k)
n := A.length
B := [0..k]
C := [0..n-1]
for i = 0 to n-1 do
B[i] = 0
for i = 0 to n-1 do
B[A[i]] = B[A[i]] + 1
for i = 1 to k do
B[i] = B[i - 1] + B[i]
for j = n-1 downto 0 do
C[B[A[j]] - 1] := A[j]
B[A[j]] := B[A[j]] - 1
for i = 0 to n-1 do
A[i] := C[i]
Come la versione non stabile, questo algoritmo costa di tempo e di spazio.