Counting sort
Ordinamento di una sequenza numerica tramite il counting sort
ClasseAlgoritmo di ordinamento
Struttura datiArray
Caso peggiore temporalmente
Caso ottimo temporalmente
Caso medio temporalmente

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.

Descrizione intuitiva

modifica

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, , e minimo, , dell'array e si prepara un array ausiliario di lunghezza , che inizialmente contiene solo zeri. conterrà le frequenze di ciascun elemento in (ad esempio se appare una sola volta all'interno di ).

Una volta costruito , si visita l'array per popolarlo. Ogni volta che si incontra il valore in , si andrà ad aumentare di uno il valore di . Al termine di questo processo, sarà pari al numero di occorrenze dell'elemento nell'array di partenza .

Infine, per ordinare , si scorre dalla prima cella all'ultima, scrivendo in il valore per volte. Va notato che se un elemento non è presente in , allora sarà pari a 0, e dunque quell'elemento non sarà inserito.

sarà ordinato alla fine di questo processo perché si è sfruttata la possibilità di accedere prima casualmente e poi sequenzialmente agli indici di : scansionare un array significa accedere ai suoi indici in ordine, perciò l'ordinamento è garantito da questa proprietà.

Esempio

modifica
Array A: 2 5 2 7 8 8 2 3 6

Prima scansione

modifica

Con una scansione di individuo il valore minimo (2) e il valore massimo (8).

Seconda scansione

modifica

Popolo l'array , che tiene il conto delle frequenze di ciascun elemento nell'intervallo .

Array C: 3 1 0 1 1 1 2

Il significato dell'array C è il seguente: l'intero 0 = 2 è presente 3 volte nell'array A, l'intero 1+min(A)=3 è presente 1 volta, l'intero 2+min(A)=4 è presente 0 volte, e così via.

Terza scansione

modifica

Inserisco in A tre volte l'intero 2, 1 volta l'intero 3, 0 volte l'intero 4, 1 volta l'intero 5 e così via.

Array A: 2 2 2 3 5 6 7 8 8

L'array A è ora ordinato.

Complessità

modifica

L'algoritmo esegue tre iterazioni, due di lunghezza (pari alla lunghezza dell'array da ordinare) per l'individuazione di e e per il calcolo delle occorrenze dei valori, e una di lunghezza (pari a ) per l'impostazione delle posizioni finali dei valori: la complessità totale è quindi .

Non è basato su confronti e scambi e conviene utilizzarlo quando il valore di è , nel qual caso l'algoritmo è , altrimenti risulterebbero più veloci altri algoritmi.

Pseudocodice

modifica
countingSort(A[])
   //Calcolo 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]
   end for
  //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
   end for
   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
   end for
   //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
   end for

Bibliografia

modifica
  • Thomas Cormen, Charles E. Leiserson, Ronald Rivest, Sorting in Linear Time, in Introduction to Algorithms, 2ª ed., Cambridge, Massachusetts, The MIT Press, 1998, pp. 175-177.
  • Thomas Cormen, Charles E. Leiserson, Ronald Rivest, Clifford Stein, Capitolo 8, Ordinamento in tempo lineare, in Introduzione agli algoritmi e strutture dati, 3ª ed., Cambridge, Massachusetts, McGraw-Hill Education, 2010, pp. 159-161.

Altri progetti

modifica
  Portale Informatica: accedi alle voci di Wikipedia che trattano di informatica

📚 Artikel Terkait di Wikipedia

Radix sort

Harold H. Seward nel 1954, attraverso il suo rapporto tecnico Information sorting in the A-2 computer del MIT. Il lavoro di Seward adattò i principi di ordinamento

Trippel sort

Swap(A() as <integer>, i as integer, j as integer) dim temp as <integer> temp = A(i) A(i) = A(j) A(j) = temp end // Sostituire lo pseudotipo <integer> con quello

Successione di interi frattale

Acta Arithmetica 73, 1995. (EN) Clark Kimberling, Harris S. Shultz, Card sorting by dispersions and fractal sequences, Ars Combinatoria 53, 1999. Portale

Funtore (programmazione)

compare_function(int A, int B) { return (A < B); } ... /* Declaration of C sorting function */ void sort_ints(int* begin_items, int num_items, int (*cmpfunc)(int

Notazione L

venne da Carl Pomerance nel suo scritto "Analysis and comparison of some integer factoring algorithms". Questa forma aveva soltanto il parametro c {\displaystyle

2-satisfiability

Graph Algorithms, vol. 1, 1972, DOI:10.1137/0201010. ^ Robust topological sorting and Tarjan's algorithm in Python, su logarithmic.net. URL consultato il