Title: Algoritmi di ordinamento
1Algoritmi di ordinamento
Didattica della programmazione I Prof. Giulio
Giunta
Calzetta Emilia Cervone Vincenzo
2Contenuti
- Algoritmi di ordinamento iterativi e ricorsivi
- Ordinamento per inserimento Insertion-sort
- Ordinamento per selezione del min/max
Selection-sort - Ordinamento a bolle Bubble-sort
- Analisi della complessità nel contare gli scambi
e i confronti (caso peggiore) - Analisi comparata
- Simulazioni in linguaggio VB
Riferimenti Cormen, Leiserson, Rivest-
Introduzione agli algoritmi -McGrawHill
3- Classe 3 I.T.I.S.
- Prerequisiti
- Conoscenze sullorganizzazione dei dati mediante
la struttura vettoriale - Conoscenze della teoria della ricorsione e
delliterazione - Conoscenze della teoria e implementazione degli
algoritmi - Conoscenze del linguaggio Visual Basic e delle
Macro di Excel - Obiettivi
- Saper gestire lorganizzazione e ordinamento dei
dati in un vettore - Capire limportanza dellordinamento dei dati
- Utilizzare le strutture di iterazione e
ricorsione - Analizzare le applicazioni relative agli
argomenti teorici affrontati - Modalità di lavoro
- lezioni frontali
- utilizzo del laboratorio
4Ordinamento di una sequenza
Una sequenza è un insieme di elementi omogenei
tra loro. Ordinare una sequenza di elementi in
ordine crescente (non-decrescente) significa
disporre gli elementi in modo da averli in
ordinati in base al loro valore dal più piccolo
al più grande da sinistra a destra.
sequenza iniziale (C,A,D,A,E,G,B,M,C)
sequenza ordinata (A,A,B,C,C,D,E,G,M)
La sequenza ordinata contiene gli stessi elementi
della sequenza iniziale e ogni elemento appare
con la stessa molteplicità nelle due sequenze.
Una sequenza (a1,a2,,an-1,an) è ordinata
(sorted) se a1 a2 an-1 an se e solo se
il valore di ai è minore di quello di ai1
oppure ai e ai1 hanno lo
stesso valore
5Ordinamento di un vettore
Un vettore (array) rappresenta un insieme di
elementi dello stesso tipo gli elementi si
distinguono uno dallaltro mediante un indice.
Linsieme dei valori assumibili dagli indici di
unarray dipende dal numero complessivo degli
elementi dellarray (SIZE) A
10 2 13 7
1
2
3
4
Dato un vettore A di interi, ordinarlo in modo
crescente (non-decrescente) significa
trasformarlo in modo tale che, per ogni indice i,
lelemento Ai sia minore o uguale di tutti gli
altri elementi di indice j, con iltj
Esempio A
Vettore iniziale
10 2 13 7
A Vettore
ordinato Ai Aj con i, j1, ,4 ,
iltj
2 4 7 13
6Importanza dellordinamento (1)
Un ordine perfetto è il fondamento di tutte le
cose (Edmund Burke 1729-1797) Laccesso a
collezioni di dati ordinate in modo opportuno è
più semplice che non laccesso a collezioni non
ordinate. A che servirebbe un elenco telefonico
se gli utenti fossero elencati in ordine sparso?
Anche nei calcolatori, è spesso utile gestire
collezioni di dati ordinate secondo un qualche
criterio di ordinamento, questo ad esempio
permette di usare algoritmi di ricerca più
efficienti (ricerca binaria)
7Importanza dellordinamento (2)
La tecnica di ricerca binaria, rispetto alla
ricerca esaustiva, consente di eliminare ad ogni
passo metà degli elementi del vettore
procedure r_bin(inn,elenco,chiave
outtrovato,indice) var elenco
array(1..n) of character var chiave
character var n,indice,mediano,primo,ultimo
integer var trovato logical begin primo 1
ultimo n trovato false repeat mediano
(primoultimo)/2 if chiave elenco(mediano)
then trovato true else if
chiave lt elenco(mediano) then ultimo
mediano - 1 else primo mediano
1 endif endif until trovato or
primo ultimo indice mediano end
2
5
11
15
19
28
35
41
50
5
19
19
5
11
primo
ultimo
primo
ultimo
chiave 11
primo1 ultimo9 trovatofalse
primo 1 ultimo n trovato false
primo 1 ultimo n trovato false
primo3 ultimo4 trovatofalse
trovato true
primo1 ultimo4 trovatofalse
mediano(91)/25 elenco519
mediano (primoultimo)/2
mediano (primoultimo)/2
mediano (primoultimo)/2
mediano (primoultimo)/2
mediano(41)/22 elenco25
if chiave elenco(mediano) then trovato
true
if chiave elenco(mediano) then trovato
true
mediano(34)/23 elenco311
11lt19 ---gt primo 1 ultimo4
if chiave lt elenco(mediano) then ultimo
mediano - 1
if chiave lt elenco(mediano) then ultimo
mediano - 1
11gt5 ---gt primo 213
else primo mediano 1
else primo mediano 1
Elemento è stato trovato nella terza locazione
dellarray indice3
Iterazione2
Iterazione3
indice mediano
indice mediano
Iterazione1
8Chiave di ordinamento
Il valore su cui si effettua lordinamento di un
insieme di elementi si definisce chiave (key) di
ordinamento. Nel caso si desideri ordinare
insiemi di variabili con differenti tipi di
valori (record o strutture) occorre definire
bene la chiave dellordinamento.
Ordinamento per media (con valori ripetuti)
Ordinamento per cognome e nome (Es. ordinamento
alfabetico del registro di classe)
Esempio
type studente record cognome
character nome character matricola
integer media integer end var
stud1,stud2,stud3,stud4,stud5 studente
9Problema ordinare in ordine crescente un insieme
di studenti considerando le chiavi di
ordinamento Key1cognome Key2nome
Key3matricola Key4media scolastica
Key1 Verdi Bianchi Russo Bianchi Esposito Neri
Key2 Mario Antonio Carlo Gianni Luca Marco
Key3 00130 00134 00120 00127 00140 00124
Key4 6 9 6 8 5 7
1 2 3 4 5 6
Ordinamento crescente per matricola
Key1 Russo Neri Bianchi Verdi Bianchi Esposito
Key2 Carlo Marco Gianni Mario Antonio Luca
Key3 00120 00124 00127 00130 00134 00140
Key4 6 7 8 6 9 5
1 2 3 4 5 6
10Key1 Verdi Bianchi Russo Bianchi Esposito Neri
Key2 Mario Antonio Carlo Gianni Luca Marco
Key3 00130 00134 00120 00127 00140 00124
Key4 6 9 6 8 5 7
1 2 3 4 5 6
Ordinamento crescente per media scolastica
Key1 Esposito Verdi Russo Neri Bianchi Bianchi
Key2 Luca Mario Carlo Marco Gianni Antonio
Key3 00140 00130 00120 00124 00127 00134
Key4 5 6 6 7 8 9
1 2 3 4 5 6
Ordinamento crescente per cognome e nome
Key1 Bianchi Bianchi Esposito Neri Russo Verdi
Key2 Antonio Gianni Luca Marco Carlo Mario
Key3 00134 00127 00140 00124 00120 00130
Key4 9 8 5 7 6 6
1 2 3 4 5 6
11Iterazione e ricorsione (1)
Gli algoritmi di ordinamento possono essere
iterativi e ricorsivi Iterazione ripetere piu
volte una sequenza di operazioni Esempio somma
i primi n interi ( ( ( (1) 2) 3) n)
for (i1, iltn, i) sommasomma i
La caratteristica fondamentale di un algoritmo
ITERATIVO è che a ogni passo è disponibile un
risultato parziale dopo k passi, si ha a
disposizione il risultato parziale relativo al
caso k
12Iterazione e ricorsione (2)
Gli algoritmi ricorsivi si basano sulla
possibilità di definire una funzione in termini
di se stessa. Una funzione è definita
ricorsivamente quando nella sua definizione
compare un riferimento a se stessa.
Esempio somma i primi n iteri Sn n Sn-1 n
somma dei primi (n-1) numeri interi
- Risolvere un problema con un approccio ricorsivo
comporta - di identificare un caso base la cui soluzione
sia nota - di riuscire a esprimere la soluzione al caso
generico n in termini dello stesso problema in
uno o più casi più semplici (n-1, n-2, etc).
13Esempio di funzione ricorsiva
Sn n Sn-1 somma dei primi n
iteri n soluzione del problema della somma dei
primi (n-1) iteri
somma dei primi (n-1) interi è una istanza più
semplice del problema somma dei primi n interi
e tale istanza può essere scomposta, a sua volta,
in unistanza ancora più semplice
Sn n(n-1)Sn-2
Procedendo in queste scomposizioni si giunge fino
allistanza banale del problema S1 1 Sn
n(n-1)(n-2)(n-3)1
Osserviamo che nella ricorsione, a differenza
delliterazione, non si dispone di un risultato
parziale finché non si è giunti fino allistanza
elementare
14Selection-sort (ordinamento per selezione)
Sia A un array di n elementi da ordinare. L
algoritmo selection-sort seleziona lelemento con
valore minore e lo scambia con il primo elemento.
Tra gli n-1 elementi rimasti viene poi ricercato
quello con valore minore e scambiato con il
secondo e così di seguito fino allultimo
elemento.
- METODO
- Iteriamo i seguenti passi
- larray A è diviso in 2 parti
- Parte iniziale ordinata parte da ordinare
- cerchiamo lelemento minimo nella parte non
ordinata e lo scambiamo con il primo della parte
non ordinata
15 Selection-sort
Parte iniziale ordinata parte da ordinare
I iterazione A1..n non ordinato, cerca minimo
di A1..n e scambialo con A1. Quindi A1
A2..n
II iterazione A1 ordinato, A2..n non
ordinato, cerca minimo di A2..n e scambialo con
A2. Quindi A1A2 A3..n
generica iterazione A1..i-1 ordinato, Ai..n
non ordinato, cerca minimo di Ai..n e
scambialo con Ai. Quindi A1..i-1 Ai
Ai1,..n
Per in-1 A1..n-2 An-1,An cerca il
minimo tra An-1 e An, scambialo con An-1
ARRAY A ORDINATO!
16Esempio selection-sort Sia A un array di 6
elementi da ordinare in modo crescente
SelectionSort(A, min, temp) for i1 to n-1 do
min i for ji1 to n do If A(min)gtA(j)
then min j endif endfor
temp Amin Amin Ai Ai
temp endfor
j6
j5
j3
j4
j5
j6
j4
j5
j6
j6
j5
j2
j3
j4
15
11
5
1
15
7
7
11
1
min i
11
5
5
11
1
i2
5
11
7
i4
11
15
i5
15
19
19
min i
i1
min i
min i
i3
min i
min i
min i
min i
min i
min i
for ji1 to n do If A(min)gtA(j) then min
j endif
for ji1 to n do If A(min)gtA(j) then min
j endif
for ji1 to n do If A(min)gtA(j) then min
j endif
for ji1 to n do If A(min)gtA(j) then min
j endif
for ji1 to n do If A(min)gtA(j) then min
j endif
for ji1 to n do If A(min)gtA(j) then min
j endif
for ji1 to n do If A(min)gtA(j) then min
j endif
for ji1 to n do If A(min)gtA(j) then min
j endif
for ji1 to n do If A(min)gtA(j) then min
j endif
for ji1 to n do If A(min)gtA(j) then min
j endif
min1
min2
min3
min2
min3
min5
min4
min5
La parte sinistra del vettore è già ordinata
1
5
temp Amin Amin Ai Ai
temp
temp Amin Amin Ai Ai
temp
temp Amin Amin Ai Ai
temp
temp Amin Amin Ai Ai
temp
7
temp Amin Amin Ai Ai
temp
temp Amin Amin Ai Ai
temp
temp Amin Amin Ai Ai
temp
11
temp Amin Amin Ai Ai
temp
temp Amin Amin Ai Ai
temp
15
temp Amin Amin Ai Ai
temp
temp
17Problema Sviluppare un algoritmo di selection
sort basato sulla selezione del massimo per
ordinare in modo crescente un array A di n
elementi
procedure ord_sel_max(inn inouta) var
n,indice_maxinteger var aarray(1..n)of
character begin for in,2 step-1 do
indice_max 1 for k2,i do if
a(indice_max)lta(k)then indice_max
k endif endfor scambiare_c(a(i),a(indice_max
)) endfor end
for in,2 step-1 do determinare lelemento
massimo della porzione 1..i dellarray
metterlo allultimo posto della porzione endfor
18Analisi del selection-sort (1)
Loperazione dominante per il selection-sort è
il confronto tra coppie di elementi, per n-1
volte bisogna determinare il minimo tra gli
elementi non ordinati e se necessario effettuare
uno scambio
Durante la prima iterazione bisogna effettuare
n-1 confronti per determinare il minimo tra gli n
elementi.
Durante la seconda iterazione bisogna effettuare
n-2 confronti per determinare il minimo tra gli
n-1 elementi. .
19Analisi del selection-sort (2)
Durante la n-1 iterazione bisogna effettuare 1
confronti per determinare il minimo tra 2
elementi.
Quindi il numero di confronti è ? n-i
(n-1)(n-2)21 n(n-1)/2 Per cui il tempo di
esecuzione dellalgoritmo tende a n2
n-1
i1
Il comportamento del selection-sort è
indipendente dallordine preesistente nellarray
da ordinare il caso peggiore (array ordinato in
ordine decrescente) e quello migliore coincidono
(array ordinato in ordine crescente)
20Insertion-sort (ordinamento per inserimento)
Linsertion-sort è un algoritmo molto semplice
che si basa sul metodo usato per ordinare le
carte da gioco per ordinare le carte nelle tue
mani estrai una carta, scala le carte rimanenti,
e inserisci la carta estratta nel posto corretto
tra quelle già considerate e ordinate
Analogamente per ordinare un vettore di interi
a1n in ordine crescente, consideriamo il primo
elemento come un sottovettore ordinato e
inseriamo gli elementi a2,,an uno dopo
laltro nella giusta posizione tra quelli già
considerati e ordinati
21- Metodo Insertion-sort
- ordinare i primi 2 elementi (porzione 1..2)
- ordinare i primi 3 elementi (porzione 1..3),
inserendo il terzo elemento nella posizione
corretta rispetto ai precedenti
- ordinare i primi 4 elementi (porzione 1..4),
inserendo il quarto elemento nella posizione
corretta rispetto ai precedenti
- ordinare i gli n elementi (porzione
1..n),inserendo lennesimo elemento nella
posizione corretta rispetto ai precedenti
22Esempio Sia A il vettore da ordinare.
Ordiniamo i primi 2 elementi (porzione 1-2)
poi ordiniamo gli elementi dalla terza posizione
in poi inserendoli nella posizione corretta
rispetto ai precedenti
j1
j0
j2
j1
j0
j3
j4
j3
j2
j5
InsertionSort(A,n, temp) for i2 to n do temp
a(i) j i-1 while jgt1 and templta(j)
a(j1) a(j) j j-1 end while a(j1)
temp endfor end
A
15
11
5
1
15
7
5
11
19
i2
i3
11
11
11
5
5
1
i4
i5
15
11
7
i6
19
temp a(i) j i-1
temp a(i) j i-1
temp a(i) j i-1
temp a(i) j i-1
temp a(i) j i-1
temp a(i) j i-1
temp a(i) j i-1
temp a(i) j i-1
temp a(i) j i-1
temp a(i) j i-1
i2
i3
i4
i5
i6
La condizione è falsa
La condizione è falsa
a(j1) a(j) j j-1
a(j1) a(j) j j-1
a(j1) a(j) j j-1
a(j1) a(j) j j-1
a(j1) a(j) j j-1
a(j1) a(j) j j-1
La condizione è falsa
La condizione è falsa
7
19
5
1
15
a(j1) temp
a(j1) temp
a(j1) temp
a(j1) temp
a(j1) temp
a(j1) temp
a(j1) temp
a(j1) temp
a(j1) temp
a(j1) temp
temp
endfor
endfor
Linsertion-sort è un algoritmo di ordinamento
stabile
23Il metodo di ordinamento ad inserzione si basa
sull'idea che un vettore ordinato si ottiene
inserendo le sue componenti una per una "al posto
giusto".
Non si introduce un secondo vettore, ma si
"simula" linserzione degli elementi nel vettore
dato (ordinamento in loco).
Linsertion-sort è un algoritmo stabile
24Algoritmi di ordinamento stabili
Se nellarray da ordinare ci sono due o più
elementi con lo stesso valore, allora tali
elementi compaiono nellarray di output nello
stesso ordine in cui compaiono in quello di
input. (Algoritmo Stabile)
Esempio (Alg. Stabile) ordinare un vettore di
voti scolastici
5
5
6
7
7
8
voto Carlo
voto Rita
voto Mario
voto Luca
voto Paolo
voto Gina
Si conserva lordinamento sul nome!
25Problema Verificare che lalgoritmo di selection
sort basato sulla selezione del massimo per
ordinare in modo crescente un array A di n
elementi non è stabile
for in,2 step-1 do determinare lelemento
massimo della porzione 1..i dellarray metterlo
allultimo posto della porzione endfor
voto Carlo a1
voto Luca a2
voto Gina a3
voto Mario a5
voto Rita a4
voto Paolo a6
voto Mario
voto Paolo
voto Rita
voto Rita
Si perde lordinamento sul nome algoritmo
non-stabile
5 7 8 5 6 7
7
6
5
5
i5
i4
i6
i3
i2
5
7
8
7
6
5
voto Carlo
voto Luca
voto Gina
voto Paolo
voto Mario
voto Rita
26Analisi delle prestazioni dellinsertion-sort (1)
Loperazione dominante per lalgoritmo è il
confronto tra coppie di elementi. L'ordinamento
per inserimento inserisce gli elementi lavorando
meno se essi sono gia' parzialmente ordinati.
Il caso migliore si ha quando il vettore è già
ordinato in modo crescente in tal caso bastano
n-1 confronti.
Il caso peggiore si ottiene invece nel caso in
cui la sequenza di elementi si presenta in ordine
inverso, cioè quando larray è ordinato in modo
decrescente, perchè in questo caso il numero di
confronti sarà pari al numero di elementi già
ordinati.
27Analisi delle prestazioni dellinsertion-sort(2)
Analizziamo il caso peggiore considerando
lordinamento delle carte da gioco
- linsertion-sort durante la prima passata esegue
un confronto con con la carta più a sinistra
nellarray
- durante la seconda passata esegue due confronti
con le due carte più a sinistra dellarray)
- durante la n-1 esima passata vengono eseguiti al
più n-1 confronti
Quindi il numero di confronti totali su di un
array di dimensione n è ? i 1 2 3 ...
n-1 n(n-1)/2
n-1
i1
28Bubble-sort (ordinamento a bolle)
Lordinamento a bolle è un algoritmo semplice
basato sul metodo degli scambi. Si fanno salire
gli elementi più piccoli verso linizio del
vettore scambiandoli con quelli adiacenti.
Si procede confrontando gli elementi a coppie e
ogni qualvolta si trova una coppia non ordinata
si scambiano di posto i due elementi.
Dato il vettore An, si opera confrontando A1
con A2 e se A1 è maggiore di A2, si
effettua uno scambio tra i due vengono poi
confrontati A2 con A3, A3 con A4, An-1
con An scambiando di posto quegli elementi che
non formano coppie ordinate.
29Bubble-sort (ordinamento a bolle)
Alla fine dellesecuzione del primo ciclo di
operazioni lelemento più grande si trova
automaticamente in ultima posizione in quanto gli
elementi più piccoli sono "risaliti" nel vettore
come delle bolle (da qui la definizione di
Bubble-Sort).
Successivamente, al termine del secondo ciclo di
operazioni, lelemento maggiore tra A1,
A2,.An-1 sarà posizionato alla penultima
(n-1) posizione si procede in questo modo finchè
non ci saranno più valori da scambiare (array
ordinato)
30Esempio Sia A il vettore da ordinare
BubbleSort(A,n,scambio,temp) i1 repeat
scambio 0 for ji1 to n do if
(Aj lt Aj-1) then tempAj
AjAj-1 Aj-1temp
scambio1 endif endfor until
scambio0 end
La condizione è falsa
j3
j2
j4
j5
j2
j4
scambio 0
scambio 0
A
15
11
5
1
15
7
19
5
11
11
7
5
11
1
11
1
15
15
7
5
1
11
7
19
15
tempAj AjAj-1 Aj-1temp scambio1
tempAj AjAj-1 Aj-1temp scambio1
tempAj AjAj-1 Aj-1temp scambio1
tempAj AjAj-1 Aj-1temp scambio1
tempAj AjAj-1 Aj-1temp scambio1
tempAj AjAj-1 Aj-1temp scambio1
tempAj AjAj-1 Aj-1temp scambio1
tempAj AjAj-1 Aj-1temp scambio1
Scambio0 Vettore Ordinato!
Scambio0
Scambio1
j-13
j-11
j-12
j-13
j-14
j-11
5
1
7
1
7
temp
Il bubble-sort è un algoritmo stabile come
linsertion-sort
31Analisi delle prestazioni del bubble-sort(1)
Nel bubble sort loperazione dominante è il
confronto tra coppie di elementi, loperazione di
scambio degli elementi viene eseguita meno spesso
rispetto al confronto degli elementi e ha lo
stesso costo.
Lalgoritmo BubbleSort esegue un numero di
operazioni variabili a seconda dellordinamento
già presente nel vettore
Il caso migliore si ha quando larray è già
ordinato ed è sufficiente effettuare solo un
ciclo per verificare che tutti gli elementi sono
ordinati, quindi sono sufficienti n-1 confronti.
Il caso peggiore si ha quando gli elementi
nellarray sono ordinati in senso decrescente.
32Analisi delle prestazioni del bubble-sort(1)
Nel caso peggiore il bubble sort effettua i
seguenti confronti
- Durante il primo ciclo vengono eseguiti n-1
confronti e altrettanti scambi
- Durante il secondo ciclo vengono eseguiti n-2
confronti e altrettanti scambi
- Durante il terzo ciclo vengono eseguiti n-3
confronti e altrettanti scambi - .
- Durante ln-esimo ciclo viene eseguito un
confronto e uno scambio
- Quindi nel caso peggiore il numero di confronti e
scambi su di un array di dimensione n è - ? (n-i) n ? 1 - ? i n(n-1)-n(n-1)/2
n(n-1)/2
n1
n1
n1
i1
i1
i1
33Algoritmi di ordinamento ricorsivi
DIVIDE ET IMPERAdicevano i latini sia con il
significato che una volta conquistato un nuovo
territorio è meglio tenere diviso il popolo, se è
ostile, per evitare rivolte e sovversioni sia
con il significato di partizionare il territorio
per amministrarlo meglio.
Il motto latino Divide et Impera è stato
acquisito dallinformatica come tecnica per
risolvere problemi complessi, in pratica si
genera una sequenza di istanze via via più
semplici del problema, fino all'istanza che non è
più suddivisibile e che ha soluzione banale
34Selection-Sort ricorsivo
Gli algoritmi di ordinamento visti finora possono
essere realizzati anche con metodi ricorsivi. La
ricorsione è un metodo molto più elegante
delliterazione
La versione ricorsiva del Selection-Sort si basa
su di un idea molto semplice
ordina il vettore metti il minimo all'inizio
ordina il resto del vettore
Alla prima invocazione bisogna ordinare tutto il
vettore, alla seconda tutto tranne il primo, poi
tutto tranne il secondo, ecc.
Useremo un parametro inizio per ordinare il
vettore a partire dall'indice inizio fino alla
fine, ordinando la parte di vettore Ainizio,
Ainizio1, ... , AA.length-1
35Algoritmo ricorsivo del Selection-Sort
SelectRic(int A, int inizio) int i,
minpos minposinizio for(iinizio
iltA.length i)
if(AiltAminpos) minposi
int tempAinizio AinizioAminpos
Aminpostemp SelectRic(A,
inizio1)
Metodo ricorsivo Selection-Sort Metto il minimo
in prima posizione, poi ordino quello che resta
del vettore.
- Cerco il minimo fra Ainizio, Ainizio1, ... ,
AA.length-1
- Lo metto in Ainizio (faccio lo scambio)
- Faccio la chiamata ricorsiva passando inizio1
Manca ancora il caso base della ricorsione!
36Selection-Sort caso base Ogni volta che viene
richiamata la funzione SelectRic (invocazione del
metodo), la parte di vettore da ordinare ha un
elemento in meno. Alla fine si arriva al vettore
di un elemento, questo succede quando inizio è
l'ultimo elemento del vettore.
SelectRic(int A, int inizio) int i,
minpos if(iniziogtA.length-1) return
minposinizio for(iinizio iltA.length
i) if(AiltAminpos) minposi int
tempAinizio AinizioAminpos
Aminpostemp SelectRic(A, inizio1)
In pratica inizio aumenta di uno a ogni
invocazione ricorsiva e quando arriva alla fine
si deve ordinare la parte di vettore con un
elemento solo (che è già banalmente ordinato!)
37Bubble-Sort ricorsivo
Nellordinamento a bolle dobbiamo far risalire
gli elementi più leggeri (più piccoli) fino alla
cima del vettore.
BubbleRic(int A, int fine) int i, temp
for(i0 iltfine-1 i) if(AigtAi1)
tempAi AiAi1 Ai1temp
BubbleRic(A, fine-1)
Il ciclo for mette il massimo alla fine, dopo
aver fatto questo, resta da ordinare il resto del
vettore (tutto tranne l'ultimo elemento). Nella
chiamata ricorsiva viene specificato dove il
vettore termina (cioè dove finisce la parte di
vettore da ordinare)
- Faccio il ciclo di confronti, che mette il
massimo alla fine.
- Faccio l invocazione ricorsiva su tutto il
vettore tranne lultimo elemento.
Manca il caso base!
38BubbleRic(A, fine) int i, temp
if(fine0) return // CASO BASE for(i0
iltfine-1 i) if(AigtAi1)
tempAi AiAi1 Ai1temp
BubbleRic(A, fine-1)
Bubble-Sort caso base La parte di vettore da
ordinare diventa sempre più piccola a ogni
invocazione ricorsiva.
Alla prima invocazione fine vale A.length-1 poi
diminusce di uno, poi ancora di uno, ecc.
Quando fine0 la parte di vettore da ordinare è
il solo primo elemento (che è già ordinato!)
39Insertion-Sort ricorsivo
- Lidea di ordinamento è simile al modo che,
durante una partita a carte, si usa per ordinare
le carte nella propria mano. - Si inizia con la mano vuota e le carte capovolte
sul tavolo - Poi si prende una carta alla volta dal tavolo e
si inserisce nella giusta posizione - Per trovare la giusta posizione per una carta, la
confrontiamo con le altre carte nella mano, da
destra verso sinistra. Ogni carta più grande
verrà spostata verso destra in modo da fare posto
alla carta da inserire. - Linsertion-Sort è uno algoritmo di ordinamento
molto efficiente per ordinare un piccolo numero
di elementi
40INSERTION SORT RICORSIVO start from 1
insertion_sort( A, from, to) if (
from1 gt to ) // CASO BASE from gt to il
vettore è ordinato temp Afrom1)
i from while ( igt0 AND Ai gt
temp) // passo base Ai1Ai
ii-1 Ai1 temp
insertion_sort( A , from1, to) // RICORSIONE
41Prestazioni degli algoritmi di ordinamento
(risultati sperimentali)
Un altro modo per confrontare le prestazioni
degli algoritmi di ordinamento consiste,
semplicemente, nelleseguire molti test per ogni
algoritmo al crescere della dimensione n
dellinput e nel confrontarne i tempi di
esecuzione misurati tenendo conto dei casi in cui
il vettore è ordinato in modo crescente,
decrescente e random. I tempi sono generalmente
espressi nella forma minuti secondi.
Questo tipo di misurazione ha lo svantaggio che i
tempi di esecuzione degli algoritmi dipendono
dalle prestazioni della macchina su cui sono
eseguiti (velocità del processore, capacità della
memoria centrale), per cui il tempo di esecuzione
di un algoritmo può variare notevolemente se
eseguito su macchine differenti.
42Questi sono i risultati forniti da un programma
(eseguito su un Pentium 3 di 500 MegaHertz)
utilizzato per ordinare con gli algoritmi
analizzati in questo corso un vettore di 15.000
elementi. I tempi sono nella forma minuti
secondi.
43Implementazione degli algoritmi di sorting
Gli algoritmi di sorting si possono implementare
in svariati modi (Java, linguaggio C, Visual
Basic, MATLAB, etc.) in questo corso abbiamo
scelto il metodo più semplice, cioè le macro di
Excel. Questa scelta è mirata a motivare
linteresse di tutti gli alunni, compresi quelli
che potrebbero ritenere difficile luso di
metodi più sofisticati. Analizziamo delle
semplici simulazioni degli algoritmi di sorting
che sono state sviluppate con le macro di
Microsoft Excel
44BubbleSort 3-D (curiosità)
Al seguente link è disponibile un algoritmo 3-D
per ordinare pixel di colori con il Bubble sort
http//www.magma.ca/gtaylor/3dBubbleSort.htm
Eseguibile BubbleSort 3-D
45Riferimenti
http//www.cs.oswego.edu/mohammad/classes/csc241/
samples/sort/Sort2-E.html http//faculty.harker.o
rg/robbc/Pages/Software/TheSorter/TheSorter.htm h
ttp//www.magma.ca/gtaylor/3dBubbleSort.htm http
//math.hws.edu/TMCM/java/xSortLab/ http//www.ge
ocities.com/SiliconValley/Network/1854/Sort1.html