Perché l'ordinamento per selezione è più veloce dell'ordinamento a bolle?


28

È scritto su Wikipedia che "... l'ordinamento di selezione supera quasi sempre l'ordinamento a bolle e l'ordinamento di gnomi". Qualcuno può spiegarmi perché la selezione è considerata più veloce di quella a bolle anche se entrambi hanno:

  1. Peggior complessità del caso :O(n2)

  2. Numero di confronti : O(n2)

  3. Migliore complessità temporale :

    • Ordinamento delle bolle:O(n)
    • Selezione ordinamento:O(n2)
  4. Complessità temporale media del caso :

    • Ordinamento delle bolle:O(n2)
    • Selezione ordinamento:O(n2)

Risposte:


32

Tutte le complessità che hai fornito sono vere, tuttavia sono fornite in notazione O grande , quindi tutti i valori additivi e le costanti sono omessi.

Per rispondere alla tua domanda, dobbiamo concentrarci su un'analisi dettagliata di questi due algoritmi. Questa analisi può essere fatta a mano o trovata in molti libri. Userò i risultati di Knuth's Art of Computer Programming .

Numero medio di confronti:

  • Ordinamento bolle :12(N2NlnN(γ+ln21)N)+O(N)
  • Ordinamento inserzione :14(N2N)+NHN
  • selezione :(N+1)HN2N

Ora, se tracciate queste funzioni, otterrete qualcosa del genere: tracciare Plot2

Come puoi vedere, l'ordinamento a bolle è molto peggio all'aumentare del numero di elementi, anche se entrambi i metodi di ordinamento hanno la stessa complessità asintotica.

Questa analisi si basa sul presupposto che l'input sia casuale, il che potrebbe non essere vero in ogni momento. Tuttavia, prima di iniziare l'ordinamento, possiamo consentire casualmente la sequenza di input (usando qualsiasi metodo) per ottenere il caso medio.

Ho omesso l'analisi della complessità temporale perché dipende dall'implementazione, ma è possibile utilizzare metodi simili.


Ho un problema con "possiamo consentire casualmente la sequenza di input per ottenere il caso medio". Perché è possibile farlo più velocemente del tempo necessario per ordinare?
Sasho Nikolov,

1
Puoi consentire qualsiasi sequenza di numeri che impiegherà tempo in cui è la lunghezza della sequenza. È ovvio che qualsiasi algoritmo di ordinamento basato sul confronto deve avere almeno una complessità di quindi anche se aggiungi alla sua complessità non cambierà molto. Comunque stiamo parlando del confronto non del tempo, la complessità del tempo dipende dall'implementazione e dal funzionamento della macchina, come ho detto nella risposta. NNO(NlogN)N
Bartosz Przybylski,

Immagino di avere sonno, hai ragione, la sequenza può essere permutata in tempo lineare.
Sasho Nikolov,

Poiché , il tuo confronto è vincolato correttamente per l'ordinamento della selezione? Sembra che tu stia insinuando che effettua in media confronti di O (n log n). HN=Θ(logN)
templatetypedef

Gamma = 0,577216 è la costante di Euler-Mascheroni. Il capitolo rilevante è "L'arte della programmazione" vol 3 sezione 5.2.2 pag. 109 e 129. Come hai tracciato il caso dell'ordinamento delle bolle, in particolare il termine O (sqrt (N))? L'hai trascurato?
mxmlnkn,

11

Il costo asintotico, o notazione matematica, descrive il comportamento limitante di una funzione poiché il suo argomento tende all'infinito, cioè al suo tasso di crescita.O

La funzione stessa, ad esempio il numero di confronti e / o swap, può essere diversa per due algoritmi con lo stesso costo asintotico, a condizione che crescano con la stessa velocità.

Più in particolare, l'ordinamento Bubble richiede, in media, swap per voce (ogni voce viene spostata dal punto di vista dell'elemento dalla posizione iniziale alla posizione finale e ogni scambio comporta due voci), mentre l'ordinamento Selezione richiede solo (una volta che è stato trovato il minimo / massimo, viene scambiato una volta alla fine dell'array).1n/41

In termini di numero di confronti, Bubble sort richiede confronti, dove è la distanza massima tra la posizione iniziale di una voce e la sua posizione finale, che di solito è maggiore di per valori iniziali distribuiti uniformemente. L'ordinamento di selezione, tuttavia, richiede sempre confronti.k n / 2 ( n - 1 ) × ( n - 2 ) / 2k×nkn/2(n1)×(n2)/2

In sintesi, il limite asintotico ti dà una buona idea di come crescono i costi di un algoritmo rispetto alla dimensione dell'input, ma non dice nulla sulle prestazioni relative di diversi algoritmi all'interno dello stesso set.


1
questa è anche un'ottima risposta
Grijesh Chauhan,

quale libro preferisci?
Grijesh Chauhan,

@GrijeshChauhan: i libri sono una questione di gusti, quindi prendi tutte le raccomandazioni con un granello di sale. Personalmente mi piacciono le "Introduzione agli algoritmi" di Cormen, Leiserson e Rivest, che offre una buona visione d'insieme di una serie di argomenti, e la serie "The Art of Computer Programming" di Knuth se hai bisogno di più / tutti i dettagli su un argomento specifico. Potresti voler verificare se la domanda di libri è stata posta qui prima, o pubblicare quella domanda se non lo è.
Pedro,

Per me, il terzo paragrafo nella tua risposta è la risposta effettiva. Non i grafici per input di grandi dimensioni, forniti in altre risposte.
Scambio eccessivo del

3

L'ordinamento a bolle utilizza più tempi di scambio, mentre l'ordinamento per selezione evita questo.

Quando si utilizza la selezione, si scambia nal massimo i tempi. ma quando si usa l'ordinamento a bolle, si scambia quasi n*(n-1). E ovviamente il tempo di lettura è inferiore al tempo di scrittura anche in memoria. Il tempo di confronto e altri tempi di esecuzione possono essere ignorati. Quindi i tempi di scambio sono il collo di bottiglia critico del problema.


Penso che l'altra risposta di Bartek sia più ragionevole, ma non posso votare o commentare ... A proposito, penso ancora che il tempo di scrittura abbia un impatto maggiore e spero che possa tenerne conto se lo vede e concorda.
simonmysun,

Non puoi semplicemente ignorare il numero di confronti, in quanto vi sono casi d'uso in cui il tempo impiegato per confrontare due elementi può superare di gran lunga il tempo impiegato per scambiare due elementi. Considera un elenco collegato di stringhe estremamente lunghe (ad esempio 100k caratteri ciascuna). La lettura in ciascuna stringa richiederebbe molto più tempo rispetto alla riassegnazione del puntatore.
Irvin Lim,

@IrvinLim Penso che potresti avere ragione, ma potrei dover vedere i dati statistici prima di cambiare idea.
simonmysun,
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.