Sort 1 - Claudio Maccherani

annuncio pubblicitario
Ordinamenti / SORT
Prof.Claudio Maccherani
1-Insertion
2-Bubble
3-Shell
4-Quick
1) INSERTION Sort
L’insertion sort (ordinamento a inserimento), è un semplice algoritmo che ordina un array senza
doverne creare un altro di appoggio. L'algor
itmo utilizza due cicli nidificati e quindi due indici: , il
primo indice inizia dal primo elemento dell’array; il secondo punta all’elemento successivo di quello
puntato dal primo indice, inizialmente al secondo. Se il primo elemento è maggiore del secondo, i due
valori vengono scambiati. Poi il secondo indice avanza di una posizione e il primo indice riparte
dall'elemento precedente quello puntato dal secondo. Se l'elemento puntato dal primo indice non è
maggiore di quello a cui punta il secondo indice, il primo indice avanza; e così fa, finché si trova nel
punto in cui il valore del primo indice deve essere inserito.
For i = 1 To n - 1
For j = i + 1 To n
I f v( j ) < v( i) Th e n
k = v( j )
v( j ) = v( i)
v( i) = k
En d I f
Next j
Next I
2) BUBBLE Sort
Il bubble sort (ordinamento a bollicine) è un semplice algoritmo che ordina un array senza doverne
creare un altro di appoggio. Il nome dell'algoritmo è dovuto al fatto che, durante l'applicazione del
procedimento, i valori vengono spostati all'interno dell'array con una dinamica che ricorda il
movimento delle bollicine in un bicchiere di spumante. In particolare, alcuni elementi attraversano
l'array velocemente (come bollicine che emergono dal fondo del bicchiere), altri più lentamente (a
differenza di quanto avviene nel caso del bicchiere di spumante, tuttavia, alcuni elementi salgono ma
altri scendono). L’algoritmo prevede che gli elementi dell'array siano confrontati a due a due, ciascun
elemento con quello successivo e se questi non risultano in ordine vengono scambiati. Il procedimento
verrà ripetuto finché, durante una scansione dell’array, non sarà fatto alcuno scambio.
Do
sca m bio = 0
For i = 1 To n - 1
I f v( i) > v ( i + 1 ) Th e n
k = v( i) : v( i) = v( i + 1 )
v( i + 1 ) = k : sca m bio = 1
En d I f
Next i
Loop W h ile sca m bio = 1
Algoritmi di Ordinamento - Prof. Claudio Maccherani – ITC “V.Emanuele II” - Perugia – a.s. 2006/07
Pag. 1
3) SHELL Sort
Lo Shell sort (da D.L.Shell che lo ideò) o Shell-Metzner sort (da Marlene Metzner che lo implementò
in Fortran) è uno dei più vecchi algoritmi di ordinamento, veloce e semplice, che ordina un array senza
doverne creare un altro di appoggio. È un’estensione dell’Insertion sort che funziona funziona
spostando i valori di più posizioni per volta man mano che risistema i valori, diminuendo gradualmente
la dimensione del passo sino ad arrivare ad uno.
i1 = 1 : D o: i1 = 3 * i1 + 1 : Loop Un t il i1 > n
Do
i1 = i1 / 3
For i = i1 + LBou n d( v ) To UBou n d( v )
Te m p = v( i)
H old = i
D o W h ile v( H old - i1 ) > Te m p
v( H old) = v( H old - i1 )
H old = H old - i1
I f H old < i1 Th e n Ex it D o
Loop
v( H old) = Te m p
Next i
Loop Un t il i1 = LBou n d( v )
4) QUICK Sort
Il Quick sort (ordinamento rapido) è un ottimo algoritmo di ordinamento ricorsivo basato sul
paradigma "divide et impera" che ordina un array senza doverne creare un altro di appoggio. Alla base
del suo funzionamento vi è l'utilizzazione ricorsiva della procedura di partizione (che, preso un
elemento dell’array, pone gli elementi più piccoli prima e quelli più grandi dopo). Ad ogni fase si
effettua un ordinamento parziale di una sequenza di oggetti da ordinare. Assunto un elemento come
perno della fase, si confrontano con esso gli altri elementi e si posizionano prima i più piccoli e dopo i
più grandi, senza tener conto del loro ordine. Dopo questa fase il perno è nella sua posizione definitiva.
Successivamente si organizzano nuovi fasi simili nelle quali si procede all'ordinamento parziale delle
sottosequenze di elementi rimasti non ordinati, fino al loro esaurimento.
Sub Qu ick _ Sor t ( I n izio, Fin e )
I f Fin e > I n iz io Th e n
Pivot = v ( I n izio) : i1 = I niz io + 1 : i2 = Fin e + 1
D o W h ile i1 < i2
I f v( i1 ) < Pivot Th e n
i1 = i1 + 1
Else
i2 = i2 – 1 : k = v( i1 ) : v( i1 ) = v( i2 ) : v( i2 ) = k
En d I f
Loop
i1 = i1 – 1 : k = v( i1 ) : v( i1 ) = v( I n izio) : v( I n izio) = k
Ca ll Qu ick _ Sor t ( I niz io, i1 )
Ca ll Qu ick _ Sor t ( i2 , Fin e )
En d I f
Algoritmi di Ordinamento - Prof. Claudio Maccherani – ITC “V.Emanuele II” - Perugia – a.s. 2006/07
Pag. 2
Algoritmi di ordinamento a CONFRONTO
Per avere un’idea dell’efficienza e velocità dei diversi algoritmi di ordinamento, vediamo
quanti scam bi vengono effettuati ordinando un vettore di 1000 elem enti contenente dei
num eriinterigeneratiin m aniera casuale. I risultatisono indicativiin quanto possono variare
in funzione della disposizione iniziale deidati.
L’algoritmo più lento risulta essere il Bubble sort (260.319 scambi), che comunque è
paragonabile all’Insertion sort (251.700 scambi). Molto più veloce lo Shell sort (15.222
scambi), ma l’algoritmo più efficiente e veloce in assoluto risulta essere, naturalmente, il
Q uick sort(7.451 scam bi).
Algoritmi di Ordinamento - Prof. Claudio Maccherani – ITC “V.Emanuele II” - Perugia – a.s. 2006/07
Pag. 3
Scarica