2 KiB
Ordinamento
Un problema molto frequente nell'informatica consiste nell'ordinare efficientemente grandi quantità di elementi.
Esistono tantissimi algoritmi per effettuare l'ordinamento.
L'efficienza di ciascuno varia di caso in caso: alcuni sono estremamente efficienti se quasi tutti i numeri sono già nell'ordine giusto; altri, invece, potrebbero impiegare tantissimo tempo.
In termini matematici, abbiamo:
- Input: A[n]
- Output: B, ∀ i < n, A[i] ≤ A[i+1]
Ordinamento tramite confronto
L'ordinamento "tradizionale" è detto ordinamento tramite confronto: funziona sempre, e non ha altri modi di ottenere informazioni se non con l'operazione logica di confronto tra i dati.
Limiti
E' un problema risolto: è dimostrabile che il suo lower bound è Ω(n log n)
; possiamo quindi dire che qualsiasi algoritmo di ordinamento è in Ω(n log n)
, e se riusciamo a trovare un algoritmo di ordinamento in O(n log n)
siamo riusciti a raggiungere il massimo dell'efficienza.
Dimostrazione
Consideriamo tutte le possibili permutazioni della sequenza da ordinare: sono n!
.
Per ogni confronto che effettuiamo, riduciamo la quantità di permutazioni correttamente ordinate; prima o poi, rimarrà una sola possibilità.
TODO, non trovo la spiegazione corretta!
Esempi
Algoritmi che effettuano l'ordinamento tramite confronto sono:
- Bubble sort
- Merge sort
- Insertion sort
- Quick sort
- Heap sort
- E tanti, tanti altri!
Ordinamento con altri mezzi
Esistono algoritmi che ricavano informazioni in altri modi, diversi dal confronto.
Essi possono avere un lower bound più basso di O(n log n)
, però hanno spesso limitazioni sul loro utilizzo.
Esempi
- Counting sort, indicizza i valori da ordinare
- Radix sort, guarda singolarmente le cifre dei valori
- Sleep sort, sfrutta i thread e la funzione sleep per ordinare valori
- E altri ancora!