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.
  1. Si crea un array di appoggio di lunghezza , con numero più alto contenuto nell’array
  2. Si cicla su A e si inserisce il conteggio di ogni valore nell’array di appoggio
  3. 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:

  1. B: similmente alla versione precedente, per tenere il conto degli elementi
  2. 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.

asd_15