mirror of
https://github.com/Steffo99/appunti-magistrali.git
synced 2024-11-24 11:14:18 +00:00
51 lines
2 KiB
Markdown
51 lines
2 KiB
Markdown
|
# Ordinamento
|
||
|
|
||
|
Un problema molto frequente nell'informatica consiste nell'**ordinare efficientemente grandi quantità di elementi**.
|
||
|
|
||
|
Esistono [tantissimi](https://it.wikipedia.org/wiki/Algoritmo_di_ordinamento) 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!
|