Innanzitutto, una definizione, poiché è piuttosto importante: un ordinamento stabile è uno che garantisce di non riordinare gli elementi con chiavi identiche.
raccomandazioni:
Ordinamento rapido: quando non è necessario un ordinamento stabile e le prestazioni medie nel caso contano più delle prestazioni nel caso peggiore. Un ordinamento rapido è O (N log N) in media, O (N ^ 2) nel peggiore dei casi. Una buona implementazione utilizza l'archiviazione ausiliaria O (log N) sotto forma di spazio di stack per la ricorsione.
Unisci ordinamento: quando hai bisogno di un ordinamento stabile, O (N log N), si tratta della tua unica opzione. L'unico aspetto negativo è che utilizza lo spazio ausiliario O (N) e ha una costante leggermente più grande di un ordinamento rapido. Esistono alcuni tipi di unione sul posto, ma AFAIK non sono tutti stabili o peggiori di O (N log N). Anche la O (N log N) al suo posto ha una costante molto più grande del semplice vecchio ordinamento di fusione che sono più curiosità teoriche che algoritmi utili.
Ordinamento dell'heap: quando non hai bisogno di un ordinamento stabile e ti preoccupi di più delle prestazioni del caso peggiore rispetto alle prestazioni del caso medio. È garantito che sia O (N log N) e utilizza lo spazio ausiliario O (1), il che significa che non si esaurirà inaspettatamente l'heap o lo spazio dello stack su input molto grandi.
Introsort: si tratta di un ordinamento rapido che passa a un ordinamento heap dopo una certa profondità di ricorsione per aggirare il caso peggiore O (N ^ 2) dell'ordinamento rapido. È quasi sempre meglio di un semplice ordinamento rapido, poiché ottieni il caso medio di un ordinamento rapido, con prestazioni O (N log N) garantite. Probabilmente l'unica ragione per usare un ordinamento di heap invece di questo è nei sistemi fortemente limitati dalla memoria in cui lo spazio dello stack O (log N) è praticamente significativo.
Ordinamento di inserzione : quando N è garantito per essere piccolo, incluso come caso base di un ordinamento rapido o unisci ordine. Mentre questo è O (N ^ 2), ha una costante molto piccola ed è un ordinamento stabile.
Ordinamento a bolle, ordinamento per selezione : quando fai qualcosa di veloce e sporco e per qualche motivo non puoi semplicemente usare l'algoritmo di ordinamento della libreria standard. L'unico vantaggio che questi hanno rispetto all'ordinamento per inserzione è essere leggermente più semplice da implementare.
Tipi non di confronto: in alcune condizioni abbastanza limitate è possibile rompere la barriera O (N log N) e ordinare in O (N). Ecco alcuni casi in cui vale la pena provare:
Conteggio ordinamento: quando si ordinano numeri interi con un intervallo limitato.
Ordinamento radix: quando il registro (N) è significativamente maggiore di K, dove K è il numero di cifre radix.
Ordinamento bucket: quando è possibile garantire che l'input sia distribuito in modo approssimativamente uniforme.