Movatterモバイル変換


[0]ホーム

URL:


Vai al contenuto
WikipediaL'enciclopedia libera
Ricerca

Merge sort

Da Wikipedia, l'enciclopedia libera.
Niente fonti!
Questa voce o sezionesull'argomento programmazionenon cita le fonti necessarie o quelle presenti sono insufficienti.
Merge sort
Esempio di merge sort con una lista di numeri casuali. Innanzitutto, si divide l'elenco nell'unità più piccola (1 elemento), quindi si confronta ogni elemento con l'elenco adiacente per ordinare e unire i due elenchi adiacenti. Infine, tutti gli elementi vengono ordinati e uniti.
ClasseAlgoritmo di ordinamento
Struttura datiArray
Caso peggiore temporalmenteO(nlogn){\displaystyle O(n\log n)}
Caso ottimo temporalmenteΩ(nlogn){\displaystyle \Omega (n\log n)}
Caso medio temporalmenteΘ(nlogn){\displaystyle \Theta (n\log n)}
Caso peggiore spazialmenteΘ(n){\displaystyle \Theta (n)}
OttimaleIn alcuni casi
Manuale

Ilmerge sort è unalgoritmo di ordinamento basato su confronti che utilizza un processo di risoluzionericorsivo, sfruttando la tecnica delDivide et Impera, che consiste nella suddivisione del problema in sottoproblemi della stessa natura di dimensione via via più piccola. Fu inventato daJohn von Neumann nel1945. Una descrizione dettagliata e un'analisi della versione bottom-up dell'algoritmo apparve in un articolo di Goldstine e Neumann già nel 1948.

Descrizione dell'algoritmo

[modifica |modifica wikitesto]

Concettualmente, l'algoritmo funziona nel seguente modo:

  1. Se la sequenza da ordinare ha lunghezza 0 oppure 1, è già ordinata. Altrimenti:
  2. La sequenza viene divisa (divide) in due metà (se la sequenza contiene un numero dispari di elementi, viene divisa in due sottosequenze di cui la prima ha un elemento in più della seconda)
  3. Ognuna di queste sottosequenze viene ordinata, applicandoricorsivamente l'algoritmo (impera)
  4. Le due sottosequenze ordinate vengono fuse (combina). Per fare questo, si estrae ripetutamente il minimo delle due sottosequenze e lo si pone nella sequenza in uscita, che risulterà ordinata

Esempio di funzionamento

[modifica |modifica wikitesto]
Simulazione del merge sort in esecuzione su un array

Supponendo di dover ordinare la sequenza [10 3 15 2 1 4 9 0], l'algoritmo procede ricorsivamente dividendola in metà successive, fino ad arrivare agli elementi

[10][3][15][2][1][4][9][0]

A questo punto si fondono (merge) in maniera ordinata gli elementi, riunendoli in coppie:

[3 10][2 15][1 4][0 9]

Al passo successivo, si fondono le coppie di array di due elementi:

[2 3 10 15][0 1 4 9]

Infine, fondendo le due sequenze di quattro elementi, si ottiene la sequenza ordinata:

[0 1 2 3 4 9 10 15]

L'esecuzione ricorsiva all'interno del calcolatore non avviene nell'ordine descritto sopra. Tuttavia, si è formulato l'esempio in questo modo per renderlo più comprensibile.

Implementazione

[modifica |modifica wikitesto]
Raffigurazione grafica delle versioni iterativa (bottom-up) e ricorsiva (top-down) dell'algoritmo

L'algoritmo può essere implementato fondamentalmente tramite due tecniche:

  1. Top-Down, che è quella presentata in questa pagina. Opera da un insiemeA{\displaystyle A} e lo divide in sotto insiemi(A1,A2){\displaystyle (A_{1},A_{2})} fino ad arrivare all'insieme contenente un solo elemento, per poi riunire le parti scomposte;
  2. Bottom-Up, che consiste nel considerare l'insiemeA{\displaystyle A} come composto da un vettore din{\displaystyle n} sequenze. Ad ogni passo vengono fuse due sequenze.

Una possibile implementazione dell'algoritmo in forma dipseudocodice tramite una tecnica top-down è la seguente:

function mergesort (a[], left, right)if left < rightthen center ← (left + right) / 2 mergesort(a, left, center) mergesort(a, center+1, right) merge(a, left, center, right)

Una possibile implementazione della funzione merge (unione di due sottosequenze ordinate) è la seguente:

function merge (a[], left, center, right)    i ← left    j ← center + 1    k ← 0    b ← array temp size= right-left+1while i ≤ centerand j ≤ rightdoif a[i] ≤ a[j]then          b[k] ← a[i]          i ← i + 1          k ← k + 1else   b[k] ← a[j]   j ← j + 1          k ← k + 1end whilewhile i ≤ centerdo       b[k] ← a[i]       i ← i + 1       k ← k + 1end whilewhile j ≤ rightdo       b[k] ← a[j]       j ← j + 1       k ← k + 1end whilefor k ← leftto rightdo       a[k] ← b[k-left]

Analisi

[modifica |modifica wikitesto]

L'algoritmo Merge Sort, per ordinare una sequenza din{\displaystyle n} oggetti, ha complessità temporaleT(n)=Θ(nlogn){\displaystyle T(n)=\Theta (n\log n)} sia nel caso medio che nel caso pessimo. Infatti:

  • la funzione merge qui presentata ha complessità temporaleΘ(n){\displaystyle \Theta (n)}
  • mergesort richiama se stessa due volte, e ogni volta su (circa) metà della sequenza in input

Da questo segue che il tempo di esecuzione dell'algoritmo è dato dalla ricorrenza:

T(n)=2T(n2)+Θ(n){\displaystyle T(n)=2T\left({\frac {n}{2}}\right)+\Theta (n)}

la cui soluzione in forma chiusa èΘ(nlogn){\displaystyle \Theta (n\log n)}, per il secondo caso delteorema principale.

Esistono implementazioni più efficienti della procedura merge, che hanno nel caso migliore complessitàO(1){\displaystyle O(1)}. Infatti, se i due array da fondere sono già ordinati, è sufficiente confrontare l'ultimo elemento del primo array con il primo elemento del secondo array per sapere che si può fonderli senza effettuare ulteriori confronti. Per cui si può implementare l'algoritmo mergesort in modo che abbia complessità O(nlogn) nel caso peggiore, e O(n) nel caso migliore, cioè quando l'array è già ordinato.

Bibliografia

[modifica |modifica wikitesto]

Altri progetti

[modifica |modifica wikitesto]

Altri progetti

Collegamenti esterni

[modifica |modifica wikitesto]
V · D · M
Algoritmi di ordinamento
TeoriaTeoria della complessità computazionale ·Notazione O Grande ·Array ·Lista ·Stack ·Coda ·Ordinamento comparativo ·Ordinamento adattivo
Algoritmi a scambioBubble sort ·Shaker sort ·Odd-even sort ·Comb sort ·Gnome sort ·Quicksort
Algoritmi di selezioneSelection sort ·Heap sort ·Smoothsort
Algoritmi ad inserimentoInsertion sort ·Shell sort ·Tree sort ·Library sort ·Patience sorting
Algoritmi a fusioneMerge sort ·Timsort
Algoritmi non comparativiRadix sort ·Bucket sort ·Counting sort ·Pigeonhole sort
Altri algoritmiRete di ordinamento ·Ordinamento topologico ·Ordinamento bitonico ·Ordinamento delle frittelle
Algoritmi inefficientiStupid sort ·Trippel sort
 Portale Informatica: accedi alle voci di Wikipedia che trattano di informatica
Estratto da "https://it.wikipedia.org/w/index.php?title=Merge_sort&oldid=144233276"
Categoria:
Categorie nascoste:

[8]ページ先頭

©2009-2026 Movatter.jp