Algoritmo di ordinamento

Mentre ci sono un gran numero di algoritmi di ordinamento, nelle implementazioni pratiche predominano alcuni algoritmi. L’ordinamento di inserimento è ampiamente utilizzato per set di dati di piccole dimensioni, mentre per set di dati di grandi dimensioni viene utilizzato un ordinamento asintoticamente efficiente, principalmente heap sort, merge sort o quicksort. Le implementazioni efficienti generalmente utilizzano un algoritmo ibrido, combinando un algoritmo asintoticamente efficiente per l’ordinamento generale con l’ordinamento di inserimento per piccoli elenchi nella parte inferiore di una ricorsione., Molto in sintonia implementazioni più sofisticate varianti, come Timsort (merge sort, insertion sort, e la logica aggiuntiva), utilizzato in Android, Java e Python, e introsort (quicksort e heap sort), utilizzato (in forme varianti) in C++ (ordinamento implementazioni e in .NET.

Per ulteriori limitato di dati, come numeri in un intervallo fisso di tempo, di distribuzione di specie quali counting sort o radix sort sono ampiamente utilizzati. Bubble sort e varianti sono raramente utilizzati nella pratica, ma si trovano comunemente nell’insegnamento e nelle discussioni teoriche.,

Quando si ordinano fisicamente oggetti (come documenti, test o libri in ordine alfabetico), le persone usano intuitivamente i tipi di inserimento per piccoli set. Per i set più grandi, le persone spesso prima secchio, come per lettera iniziale, e più bucketing permette l’ordinamento pratico di molto grandi set. Spesso lo spazio è relativamente economico, ad esempio distribuendo oggetti sul pavimento o su una vasta area, ma le operazioni sono costose, in particolare spostando un oggetto a grande distanza – la località di riferimento è importante., I tipi di unione sono anche pratici per gli oggetti fisici, in particolare poiché è possibile utilizzare due mani, una per ogni elenco da unire, mentre altri algoritmi, come heap sort o quick sort, sono poco adatti per l’uso umano. Altri algoritmi, come l’ordinamento della libreria, una variante dell’ordinamento di inserimento che lascia spazi, sono anche pratici per l’uso fisico.

Simple sortsEdit

Due dei tipi più semplici sono insertion sort e selection sort, entrambi efficienti su dati di piccole dimensioni, a causa del basso sovraccarico, ma non efficienti su dati di grandi dimensioni., L’ordinamento di inserimento è generalmente più veloce dell’ordinamento di selezione in pratica, a causa di un minor numero di confronti e di buone prestazioni su dati quasi ordinati, e quindi è preferito in pratica, ma l’ordinamento di selezione utilizza meno scritture e quindi viene utilizzato quando le prestazioni di scrittura sono un fattore limitante.

Insertion sortEdit

Articolo principale: Insertion sort

Insertion sort è un semplice algoritmo di ordinamento che è relativamente efficiente per liste piccole e liste per lo più ordinate, ed è spesso usato come parte di algoritmi più sofisticati., Funziona prendendo gli elementi dalla lista uno per uno e inserendoli nella loro posizione corretta in una nuova lista ordinata simile a come mettiamo i soldi nel nostro portafoglio. Negli array, il nuovo elenco e gli elementi rimanenti possono condividere lo spazio dell’array, ma l’inserimento è costoso, richiedendo lo spostamento di tutti gli elementi seguenti di uno. Shellsort (vedi sotto) è una variante di insertion sort che è più efficiente per elenchi più grandi.

Selection sortEdit

Articolo principale: Selection sort

Selection sort è un ordinamento comparativo sul posto., Ha complessità O(n2), rendendolo inefficiente su elenchi di grandi dimensioni e generalmente si comporta peggio dell’ordinamento di inserimento simile. L’ordinamento di selezione è noto per la sua semplicità e presenta anche vantaggi in termini di prestazioni rispetto ad algoritmi più complicati in determinate situazioni.

L’algoritmo trova il valore minimo, lo scambia con il valore nella prima posizione e ripete questi passaggi per il resto dell’elenco. Non fa più di n swap, e quindi è utile dove lo scambio è molto costoso.,

sortsEdit efficiente

Gli algoritmi pratici di ordinamento generale sono quasi sempre basati su un algoritmo con complessità temporale media (e generalmente complessità peggiore) O(n log n), di cui i più comuni sono heap sort, merge sort e quicksort. Ognuno ha vantaggi e svantaggi, con il più significativo è che la semplice implementazione di merge sort utilizza O(n) spazio aggiuntivo e la semplice implementazione di quicksort ha O(n2) complessità peggiore. Questi problemi possono essere risolti o migliorati al costo di un algoritmo più complesso.,

Mentre questi algoritmi sono asintoticamente efficienti su dati casuali, per l’efficienza pratica sui dati del mondo reale vengono utilizzate varie modifiche. Innanzitutto, il sovraccarico di questi algoritmi diventa significativo su dati più piccoli, quindi spesso viene utilizzato un algoritmo ibrido, che comunemente passa all’ordinamento di inserimento una volta che i dati sono abbastanza piccoli. In secondo luogo, gli algoritmi spesso funzionano male su dati già ordinati o dati quasi ordinati – questi sono comuni nei dati del mondo reale e possono essere ordinati in tempo O(n) da algoritmi appropriati., Infine, possono anche essere instabili e la stabilità è spesso una proprietà desiderabile in una sorta. Pertanto, vengono spesso impiegati algoritmi più sofisticati, come Timsort (basato su merge sort) o introsort (basato su quicksort, che ritorna all’heap sort).

Merge sortEdit

Articolo principale: Merge sort

Merge sort sfrutta la facilità di unire liste già ordinate in un nuovo elenco ordinato. Inizia confrontando ogni due elementi (cioè 1 con 2, quindi 3 con 4…) e scambiandoli se il primo dovesse venire dopo il secondo., Quindi unisce ciascuna delle liste risultanti di due in liste di quattro, quindi unisce quelle liste di quattro e così via; fino a quando finalmente due liste vengono unite nell’elenco ordinato finale. Degli algoritmi descritti qui, questo è il primo che scala bene a elenchi molto grandi, perché il suo tempo di esecuzione peggiore è O(n log n). Si applica facilmente anche agli elenchi, non solo agli array, in quanto richiede solo l’accesso sequenziale, non l’accesso casuale. Tuttavia, ha una complessità aggiuntiva dello spazio O(n) e coinvolge un gran numero di copie in semplici implementazioni.,

Merge sort ha visto un aumento relativamente recente di popolarità per implementazioni pratiche, a causa del suo uso nel sofisticato algoritmo Timsort, che viene utilizzato per la routine di ordinamento standard nei linguaggi di programmazione Python e Java (a partire da JDK7). Merge sort stesso è la routine standard in Perl, tra gli altri, ed è stato utilizzato in Java almeno dal 2000 in JDK1.3.

HeapsortEdit

Articolo principale: Heapsort

Heapsort è una versione molto più efficiente dell’ordinamento di selezione., Funziona anche determinando l’elemento più grande (o più piccolo) dell’elenco, posizionandolo alla fine (o all’inizio) dell’elenco, quindi continuando con il resto dell’elenco, ma esegue questo compito in modo efficiente utilizzando una struttura dati chiamata heap, un tipo speciale di albero binario. Una volta che l’elenco dei dati è stato trasformato in un heap, il nodo radice è garantito per essere l’elemento più grande (o più piccolo). Quando viene rimosso e posizionato alla fine dell’elenco, l’heap viene riorganizzato in modo che l’elemento più grande rimanente si sposti alla radice., Usando l’heap, trovare il prossimo elemento più grande richiede tempo O (log n), invece di O(n) per una scansione lineare come in simple selection sort. Ciò consente a Heapsort di funzionare in tempo O(n log n), e questa è anche la complessità del caso peggiore.

QuicksortEdit

Articolo principale: Quicksort

Quicksort è un algoritmo di divisione e conquista che si basa su un’operazione di partizione: per partizionare un array, viene selezionato un elemento chiamato pivot. Tutti gli elementi più piccoli del perno vengono spostati prima di esso e tutti gli elementi maggiori vengono spostati dopo di esso. Questo può essere fatto in modo efficiente nel tempo lineare e sul posto., Le sottoliste minore e maggiore vengono quindi ordinate ricorsivamente. Ciò produce una complessità temporale media di O (n log n), con un sovraccarico basso, e quindi questo è un algoritmo popolare. Implementazioni efficienti di quicksort (con partizionamento sul posto) sono in genere tipi instabili e un po ‘ complessi, ma sono tra gli algoritmi di ordinamento più veloci nella pratica. Insieme al suo modesto utilizzo dello spazio O(log n), quicksort è uno degli algoritmi di ordinamento più popolari ed è disponibile in molte librerie di programmazione standard.,

L’importante avvertimento su quicksort è che le sue prestazioni nel peggiore dei casi sono O(n2); mentre questo è raro, nelle implementazioni ingenue (scegliendo il primo o l’ultimo elemento come pivot) ciò si verifica per i dati ordinati, che è un caso comune. Il problema più complesso in quicksort è quindi la scelta di un buon elemento pivot, poiché scelte costantemente sbagliate di pivot possono comportare prestazioni O(n2) drasticamente più lente, ma una buona scelta di pivot produce prestazioni O(n log n), che è asintoticamente ottimale. Ad esempio, se ad ogni passo viene scelta la mediana come perno, l’algoritmo funziona in O(n log n)., Trovare la mediana, come ad esempio dalla mediana dell’algoritmo di selezione delle mediane è tuttavia un’operazione O (n) su elenchi non ordinati e quindi richiede un sovraccarico significativo con l’ordinamento. In pratica la scelta di un pivot casuale produce quasi certamente prestazioni O(n log n).

ShellsortEdit

Un ordinamento di Shell, diverso dal bubble sort in quanto sposta gli elementi in numerose posizioni di scambio.

Articolo principale: Shell sort

Shellsort è stato inventato da Donald Shell nel 1959., Migliora l’ordinamento di inserimento spostando elementi fuori ordine più di una posizione alla volta. Il concetto alla base di Shellsort è che l’ordinamento di inserimento viene eseguito in O(k n ) {\displaystyle O (kn)} time, dove k è la distanza massima tra due elementi fuori luogo. Ciò significa che generalmente, si esibiscono in O (n2), ma per i dati che sono per lo più ordinati, con solo pochi elementi fuori posto, si comportano più velocemente. Quindi, ordinando prima gli elementi lontano e riducendo progressivamente il divario tra gli elementi da ordinare, l’ordinamento finale calcola molto più velocemente., Un’implementazione può essere descritta come organizzare la sequenza di dati in un array bidimensionale e quindi ordinare le colonne dell’array utilizzando l’ordinamento di inserimento.

La complessità temporale peggiore di Shellsort è un problema aperto e dipende dalla sequenza di gap utilizzata, con complessità note che vanno da O(n2) a O(n4/3) e Θ(n log2 n)., Questo, combinato con il fatto che Shellsort è in atto, ha bisogno solo di una quantità relativamente piccola di codice, e non richiede l’uso dello stack di chiamate, rende è utile in situazioni in cui la memoria è ad un premio, come nei sistemi embedded e kernel del sistema operativo.

Bubble sort and variantsEdit

Questa sezione non cita alcuna fonte. Si prega di contribuire a migliorare questa sezione aggiungendo citazioni a fonti affidabili. Il materiale non fornito può essere sfidato e rimosso., (Maggio 2019) (Scopri come e quando rimuovere questo messaggio modello)

Bubble sort e varianti come shell sort e cocktail sort sono algoritmi di ordinamento semplici e altamente inefficienti. Sono spesso visti nei testi introduttivi a causa della facilità di analisi, ma sono raramente utilizzati nella pratica.

Bubble sortEdit

Un ordinamento a bolle, un algoritmo di ordinamento che passa continuamente attraverso un elenco, scambiando gli elementi fino a quando non appaiono nell’ordine corretto.,

Articolo principale: Bubble sort

Bubble sort è un semplice algoritmo di ordinamento. L’algoritmo inizia all’inizio del set di dati. Confronta i primi due elementi e, se il primo è maggiore del secondo, li scambia. Continua a farlo per ogni coppia di elementi adiacenti fino alla fine del set di dati. Quindi ricomincia con i primi due elementi, ripetendo fino a quando non si sono verificati swap sull’ultimo passaggio. Il tempo medio di questo algoritmo e le prestazioni del caso peggiore sono O (n2), quindi viene raramente utilizzato per ordinare set di dati grandi e non ordinati., Bubble sort può essere utilizzato per ordinare un piccolo numero di elementi (dove la sua inefficienza asintotica non è una penalità elevata). Bubble sort può anche essere utilizzato in modo efficiente su un elenco di qualsiasi lunghezza che è quasi ordinato (cioè, gli elementi non sono significativamente fuori luogo). Ad esempio, se un numero qualsiasi di elementi è fuori posto di una sola posizione (ad esempio 0123546789 e 1032547698), lo scambio di bubble sort li metterà in ordine al primo passaggio, il secondo passaggio troverà tutti gli elementi in ordine, quindi l’ordinamento richiederà solo 2n tempo.,

Comb sortEdit

Articolo principale: Comb sort

Comb sort è un algoritmo di ordinamento relativamente semplice basato su bubble sort e originariamente progettato da Włodzimierz Dobosiewicz nel 1980. È stato poi riscoperto e reso popolare da Stephen Lacey e Richard Box con un articolo di Byte Magazine pubblicato nell’aprile 1991. L’idea di base è quella di eliminare le tartarughe, o piccoli valori vicino alla fine della lista, poiché in una sorta di bolla questi rallentano enormemente l’ordinamento., (Conigli, grandi valori intorno all’inizio dell’elenco, non rappresentano un problema nell’ordinamento delle bolle) Lo fa scambiando inizialmente elementi che si trovano a una certa distanza l’uno dall’altro nell’array, piuttosto che scambiare solo elementi se sono adiacenti l’uno all’altro, e quindi restringendo la distanza scelta fino a quando non funziona come un normale ordinamento a bolle. Quindi, se Shellsort può essere pensato come una versione generalizzata di insertion sort che scambia elementi distanziati di una certa distanza l’uno dall’altro, comb sort può essere pensato come la stessa generalizzazione applicata a bubble sort.,

Distribution sortEdit

Vedi anche: External sorting

Distribution sort si riferisce a qualsiasi algoritmo di ordinamento in cui i dati vengono distribuiti dal loro input a più strutture intermedie che vengono poi raccolte e posizionate sull’output. Ad esempio, sia bucket sort che flashsort sono algoritmi di ordinamento basati sulla distribuzione. Gli algoritmi di ordinamento della distribuzione possono essere utilizzati su un singolo processore o possono essere un algoritmo distribuito, in cui i singoli sottoinsiemi vengono ordinati separatamente su processori diversi, quindi combinati., Ciò consente l’ordinamento esterno di dati troppo grandi per adattarsi alla memoria di un singolo computer.

Counting sortEdit

Articolo principale: Counting sort

Counting sort è applicabile quando ogni input è noto per appartenere a un particolare insieme, S, di possibilità. L’algoritmo viene eseguito in tempo O(|S| + n) e memoria O(|S|) dove n è la lunghezza dell’input. Funziona creando un array intero di dimensioni / S / e usando l’ith bin per contare le occorrenze del membro ith di S nell’input. Ogni input viene quindi contato incrementando il valore del relativo bin corrispondente., Successivamente, l’array di conteggio viene eseguito in loop per organizzare tutti gli input in ordine. Questo algoritmo di ordinamento spesso non può essere utilizzato perché S deve essere ragionevolmente piccolo affinché l’algoritmo sia efficiente, ma è estremamente veloce e dimostra un grande comportamento asintotico all’aumentare di n. Può anche essere modificato per fornire un comportamento stabile.

Bucket sortEdit

Articolo principale: Bucket sort

Bucket sort è un algoritmo di ordinamento divide e conquista che generalizza l’ordinamento del conteggio partizionando un array in un numero finito di bucket., Ogni bucket viene quindi ordinato individualmente, utilizzando un algoritmo di ordinamento diverso o applicando ricorsivamente l’algoritmo di ordinamento del bucket.

Un ordinamento bucket funziona meglio quando gli elementi del set di dati sono distribuiti uniformemente su tutti i bucket.

Radix sortEdit

Articolo principale: Radix sort

Radix sort è un algoritmo che ordina i numeri elaborando singole cifre. n numeri costituiti da k cifre ciascuno sono ordinati in O (n · k) tempo., Radix sort può elaborare le cifre di ciascun numero a partire dalla cifra meno significativa (LSD) o a partire dalla cifra più significativa (MSD). L’algoritmo LSD ordina prima l’elenco per la cifra meno significativa preservando il loro ordine relativo utilizzando un ordinamento stabile. Quindi li ordina per la cifra successiva e così via dal meno significativo al più significativo, finendo con un elenco ordinato. Mentre l’ordinamento radix LSD richiede l’uso di un ordinamento stabile, l’algoritmo di ordinamento radix MSD non lo fa (a meno che non sia desiderato l’ordinamento stabile). L’ordinamento MSD radix sul posto non è stabile., È comune che l’algoritmo di ordinamento del conteggio venga utilizzato internamente dall’ordinamento radix. Un approccio di ordinamento ibrido, ad esempio l’utilizzo dell’ordinamento di inserimento per contenitori di piccole dimensioni, migliora significativamente le prestazioni dell’ordinamento radix.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *