Cosa significa che un algoritmo di ordinamento è "stabile"?


43

Nella lettura di vari algoritmi di ordinamento ho visto che alcuni sono "stabili" e altri no. Cosa significa e quali compromessi sono coinvolti su quella base quando si seleziona un algoritmo?


32
A questa domanda sarà facile rispondere entro un minuto con Wikipedia. en.wikipedia.org/wiki/Sorting_algorithm
Mare Infinitus


4
Questa è una domanda priva della propria ricerca. Risposto con una foto di Wikipedia. E ottiene davvero un buon feedback, che in qualche modo mi rende triste. IMHO dovrebbe essere chiuso e non ottenere voti positivi.
Mare Infinitus,

4
D'altra parte, ho appena visto questo e ho imparato qualcosa di nuovo. Se avessi saputo che non lo sapevo, avrei potuto studiarlo, ma poiché l'OP ha posto la domanda, ora so cosa non sapevo e non lo sapevo.
Kazark,

4
In generale, "basta cercarlo" o "cercarlo su Wikipedia" non sono risposte accettabili considerevoli sui siti StackExchange. Perché non forniscono una risposta a ciò che il denunciante sta verificando come una domanda valida con la chiamata alle autorità di google e wikipedia. Se la domanda è facilmente un duplicato di un'altra o più domande all'interno di programmers.stackexchange, allora puoi lamentarti.
Michael Paulukonis,

Risposte:


88

Un ordinamento stabile è uno che preserva l'ordine originale del set di input, in cui l'algoritmo di confronto non distingue tra due o più elementi.

Prendi in considerazione un algoritmo di ordinamento che ordina le carte per rango , ma non per seme. L'ordinamento stabile garantirà il mantenimento dell'ordine originale delle carte con lo stesso valore; l'ordinamento instabile no.

inserisci qui la descrizione dell'immagine


38
Correzione: l'algoritmo instabile mostra un comportamento indefinito quando due elementi sono uguali, è perfettamente possibile che l'ordine venga talvolta conservato.
aaaaaaaaaaaa,

9
Bella foto, molto simile a wikipedia en.wikipedia.org/wiki/Sorting_algorithm
Mare Infinitus

9
@MareInfinitus: è di dominio pubblico. Controlla l'attribuzione sull'immagine originale.
Robert Harvey,

2
Una buona immagine spiega più velocemente e più di un sacco di parole sul caso medio. Le questioni legali non erano ciò di cui volevo parlare.
Mare Infinitus,

3
@RobertHarvey In realtà, credo che l'editor sia corretto. Il tuo post attualmente afferma che un ordinamento stabile preserva l'ordinamento delle carte dello stesso seme, ma le carte dello stesso seme avranno ranghi diversi e quindi devono essere riorganizzate per ottenere un ordine ordinato. Ad esempio, l'ordinamento non conserva l'ordine dei 2 e dei 5 cuori. È l'ordinamento di carte con lo stesso valore (e semi diversi) che fa la differenza tra stabile e instabile.
David Z,

26

Gli algoritmi stabili preservano l'ordine relativo degli elementi.

Quindi un algoritmo di ordinamento stabile manterrà l'ordine relativo dei valori che si confrontano come uguali.

Prendi in considerazione un algoritmo di ordinamento in cui ordiniamo una raccolta di punti 2d in base alla loro dimensione X.

Raccolta da ordinare: {(6, 3), (5, 5), (6, 1), (1, 3)}

Stabile ordinato: {(1, 3), (5, 5), (6, 3), (6, 1)}

Ordinati regolari: {(1, 3), (5, 5), (6, 3), (6, 1)}o{(1, 3), (5, 5), (6, 1), (6, 3)}


Per quanto riguarda il compromesso ... beh, l'ordinamento stabile è meno efficiente, ma a volte ne hai bisogno.

Ad esempio, quando un utente fa clic sull'intestazione di una colonna per ordinare i valori in un'interfaccia utente, è ragionevole aspettarsi che il suo precedente ordinamento venga utilizzato in caso di valori uguali.


2
È meno efficiente però? Sembra "ovvio", ma alcuni dei migliori algoritmi di ordinamento sono stabili per natura (ad es. Qualsiasi cosa basata sull'ordinamento di tipo merge, come ad esempio Tim sort), non hanno bisogno di fare alcun lavoro esplicito per essere stabili.

9
Stabile non ha nulla a che fare con le prestazioni in generale. Mergesort viene eseguito in O (n * log n) ed è stabile. Heapsort ha prestazioni simili, ma non è stabile.
Mare Infinitus,

2
"Stabile" può essere applicato anche a strutture di dati, ad es. un "heap stabile" è un heap che elimina gli oggetti che hanno la stessa priorità nello stesso ordine in cui sono stati messi in coda. Questo è molto importante per algoritmi efficienti di ricerca del percorso.
BlueRaja - Danny Pflughoeft,

1
Non ci sono tipi stabili che sono confronti O (n ln n) e anche O (1) in memoria. La velocità non è l'unica misura di efficienza. Il fatto che non sia possibile ordinare in modo stabile conta sul posto.
Domanda

3
@QuestionC Sembra che l'ordinamento dei blocchi sia stabile e si adatti a questi limiti.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.