Lista degli algoritmi principali

Algoritmi naive

Nonostante siano più i semplici, sia concettualmente sia per l’implementazione, sono anche i più inefficienti su grandi struttura dati.

Algoritmo naiveCaso miglioreCaso medioCaso peggioreLista già ordinataComplessità spaziale
bubble sort (se ottimizzato) (se ottimizzato)
selection sort
insertion sort

Algoritmi non naive

Essendo più complessi sono meno intuitivi, ma anche molto più veloci.

AlgoritmoCaso MiglioreCaso MedioCaso PeggioreLista OrdinataComplessità Spaziale
merge sort
quick sort
heap sort
bucket sort****
counting sort
* la complessità temporale del Bucket sort è sempre la somma delle complessità degli ordinamenti dei singoli bucket.

Lower bound dell’ordinamento

Si può dimostrare che il lower bound della complessità temporale degli algoritmi di ordinamento (caso pessimo al di sotto del quale nessun algoritmo di ordinamento basato su confronti fra coppie di elementi possa andare) è .

Si dimostra considerando un albero di decisione con tutte le strade possibili che termina con le “foglie” cioè i possibili output.

  1. Assumendo che i numeri da ordinare sono distinti, si può verificare solo che un numero è maggiore o minore di un altro, cioè ogni nodo genera altri due nodi; quindi ogni livello ha nodi.
  2. I possibili ordinamenti (permutazioni) di numeri sono , quindi l’albero deve avere foglie.
  3. Dato che ogni livello ha nodi, allora per arrivare ad avere un livello di nodi servirà scendere di nodi, cioè l’altezza dell’albero sarà .
  4. Si dimostra matematicamente che asintoticamente .
  5. Ogni ramo/strada che va dal primo elemento fino a una foglia (ordinamento completato), sarà lungo tanto quanto è alto l’albero, quindi per numeri bisogna prendere decisioni, cioè fare confronti.