Counting sort

algoritmo di ordinamento

Template:Stub informatica

Il Counting sort è un algoritmo di ordinamento per valori numerici interi con complessità lineare O(n+m), dove n è la lunghezza dell'array e m è pari a max(A)-min(A)+1 (max(A) e min(A) sono rispettivamenti 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 è piccolo rispetto a n, altrimenti risulterebbero più veloci altri algoritmi.

L'algoritmo è semplice ed intuitivo: si calcolano i valori max(A) e min (A) e si prepara un array C di dimensione pari all'intervallo dei valori (l'algoritmo non agisce infatti in loco) con C[i] che rappresenta la frequenza dell'elemento i+min 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 stampano, per ogni elemento i, C[i] copie.

countingSort(A[]) {

  //Cacolo degli elementi max e min
  max=A[0];
  min=A[1];
  per ogni elemento i in A{
     se A[i]>max
     allora max=A[i];
     altrimenti se A[i]<min
     allora min=A[i];
  }
  //Costruzione dell'array C
  creaarray C[max-min+1];         //crea un array C
  per ogni elemento i in A{
     valore=A[i];                 //legge il valore nell'array
     cella=valore-min;            //calcola la cella in C corrispondente al valore
     C[cella]++;                  //aumenta il numero di volte che si è incontrato il valore
  }
  //Ordinamento in base al contenuto dell'array delle fraquenze C
  k=0                             //indice per l'array A
  per ogni elemento i in C{
     num=i+min
     finchè C[i]>0{                //scrive C[i] volte il valore num nell'array A
        A[k]=num;
        k++
     }
  }

}