1
Fork 0
mirror of https://github.com/Steffo99/unisteffo.git synced 2024-11-24 17:04:20 +00:00
triennale-appunti-steffo/public/materials/year1/algoritmi/10_Ordinamento.md

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!