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 naive | Caso migliore | Caso medio | Caso peggiore | Lista già ordinata | Complessità 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.
Algoritmo | Caso Migliore | Caso Medio | Caso Peggiore | Lista Ordinata | Complessità 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.
- 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.
- I possibili ordinamenti (permutazioni) di numeri sono , quindi l’albero deve avere foglie.
- 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à .
- Si dimostra matematicamente che asintoticamente .
- 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.