Algoritmi e Strutture Dati
Capitolo 4
Ordinamento
Camil Demetrescu, Irene Finocchi,
Giuseppe F. Italiano
Algoritmi e strutture dati
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano
Ordinamento
Dato un insieme S di n oggetti presi da un
dominio totalmente ordinato, ordinare S
• Esempi: ordinare una lista di nomi alfabeticamente, o un
insieme di numeri, o un insieme di compiti d’esame in base
al cognome dello studente
• Subroutine in molti problemi
• E’ possibile effettuare ricerche in array
ordinati in tempo O(log n)
2
Copyright © 2004 - The McGraw - Hill Companies, srl
Algoritmi e strutture dati
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano
Il problema dell’ordinamento
• Input: una sequenza di n numeri <a1,a2,…,an>
• Output: una permutazione (riarrangiamento)
<a1’,a2’,…,an’> della sequenza di input tale che
a1’ a2’… an’
3
Copyright © 2004 - The McGraw - Hill Companies, srl
Algoritmi e strutture dati
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano
InsertionSort
Approccio incrementale: estende l’ordinamento da k a k+1
elementi, posizionando l’elemento (k+1)-esimo nella
posizione corretta rispetto ai primi k elementi
4
7
2
4
5
3
1
2
4
5
7
3
1
2
7
4
5
3
1
2
3
4
5
7
1
2
4
7
5
3
1
1
2
3
4
5
7
Copyright © 2004 - The McGraw - Hill Companies, srl
Algoritmi e strutture dati
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano
InsertionSort (A)
1.
for k=1 to n-1 do
2.
x = A[k+1]
3.
for j=1 to k+1 do
4.
5.
if (A[j] > x) then break
if (j < k+1) then
6.
for t=k downto j do A[t+1]= A[t]
7.
A[j]=x
• al generico passo k, A[1],…,A[k] sono già ordinati
• elemento x=A[k+1] inserito nella posizione che gli
compete
• righe 3 e 4: individuano la posizione j in cui va messo x
• riga 6: fa spazio per inserire x
5
Copyright © 2004 - The McGraw - Hill Companies, srl
Algoritmi e strutture dati
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano
Correttezza
• Si dimostra facendo vedere che dopo il
generico passo k i primi k+1 elementi sono
ordinati
• Induzione su k:
– k=0: banale. All’inizio il primo elemento è
ordinato
– k>0. All’inizio del passo k i primi k elementi
sono ordinati (ipotesi induttiva). Allora la tesi
segue dalla struttura dell’algoritmo.
6
Copyright © 2004 - The McGraw - Hill Companies, srl
Algoritmi e strutture dati
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano
Complessità temporale
• Come misurarla?
– Numero confronti
– Numero operazioni (confronti + spostamenti)
7
Copyright © 2004 - The McGraw - Hill Companies, srl
Algoritmi e strutture dati
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano
InsertionSort (A)
1.
for k=1 to n-1 do
2.
x = A[k+1]
3.
for j=1 to k+1 do
4.
5.
al più k+1
confronti
if (A[j] > x) then break
if (j < k+1) then
6.
for t=k downto j do A[t+1]= A[t]
7.
A[j]=x
nessun
confronto
k+1
operazioni
n-1
T(n) =  (k+1) =  (n2)
k=1
Numero di operazioni
nel caso migliore?
Tbest(n)=  (n2)
Possiamo fare meglio?
8
Copyright © 2004 - The McGraw - Hill Companies, srl
Algoritmi e strutture dati
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano
InsertionSort2 (A)
1.
for k=1 to n-1 do
2.
x = A[k+1]
3.
j=k
4.
while j > 0 e A[j] > x do
5.
A[j+1] = A[j]
6.
j= j-1
7.
A[j+1]=x
• Caso migliore
– Si verifica quando l’array è già ordinato
– Tbest(n)= (n)
• Caso peggiore
– array ordinato in ordine decrescente
– T(n)= (n2)
9
Copyright © 2004 - The McGraw - Hill Companies, srl
Algoritmi e strutture dati
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano
SelectionSort
Approccio incrementale: estende l’ordinamento da k a k+1
elementi, scegliendo il minimo degli n-k elementi non
ancora ordinati e mettendolo in posizione k+1
10
7
2
4
5
3
1
1
2
3
4
5
7
1
2
4
5
3
7
1
2
3
4
5
7
1
2
4
5
3
7
1
2
3
4
5
7
1
2
3
5
4
7
Copyright © 2004 - The McGraw - Hill Companies, srl
Algoritmi e strutture dati
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano
SelectionSort (A)
1.
for k=0 to n-2 do
2.
m = k+1
3.
for j=k+2 to n do
4.
5.
if (A[j] < A[m]) then m=j
scambia A[m] con A[k+1]
• al generico passo k, A[1],…,A[k] sono già ordinati
• linee 2-4: ricerca del minimo fra gli elementi
A[k+1],…,A[n]
• m è l’indice dell’array in cui si trova il minimo
• il minimo è messo in posizione k+1
11
Copyright © 2004 - The McGraw - Hill Companies, srl
Algoritmi e strutture dati
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano
Correttezza
• Si dimostra facendo vedere che dopo il generico
passo k (i) i primi k+1 elementi sono ordinati e (ii)
contengono i k+1 elementi più piccoli dell’array
• Induzione su k:
– k=0: banale. All’inizio il primo elemento è il minimo. (i) e
(ii) banalmente verificate.
– k>0. All’inizio del passo k i primi k elementi sono ordinati
e sono i k elementi più piccoli nell’array (ipotesi
induttiva). Allora la tesi segue dal fatto che l’algoritmo
seleziona il minimo dai restanti n-k elementi e lo mette in
posizione k+1. Infatti:
(ii) i k+1 elementi restano i minimi nell’array
(i) l’elemento in posizione k+1 non è mai più piccolo dei primi k
12
Copyright © 2004 - The McGraw - Hill Companies, srl
Algoritmi e strutture dati
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano
Complessità
SelectionSort (A)
1.
for k=0 to n-2 do
2.
m = k+1
3.
for j=k+2 to n do
4.
5.
if (A[j] < A[m]) then m=j
scambia A[m] con A[k+1]
n-k-1
confronti
uno
scambio
n-k
operazioni
n-2
T(n) =  (n-k-1) =  (n2)
k=0
Complessità
nel caso migliore?
13
Tbest(n)=  (n2)
Copyright © 2004 - The McGraw - Hill Companies, srl
Algoritmi e strutture dati
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano
BubbleSort
• Esegue una serie di scansioni dell’array
– In ogni scansione confronta coppie di elementi
adiacenti, scambiandoli se non sono nell’ordine
corretto
– Dopo una scansione in cui non viene effettuato
nessuno scambio l’array è ordinato
• Idea: dopo la k-esima scansione, i k elementi più
grandi sono correttamente ordinati ed occupano le
k posizioni più a destra
14
Copyright © 2004 - The McGraw - Hill Companies, srl
Algoritmi e strutture dati
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano
Esempio di esecuzione
(1)
7 2 4 5 3 1
2 7
4 7
5 7
3 7
1 7
(2)
2 4 5 3 1 7
2 4
4 5
3 5
1 5
(3)
2 4 3 1 5 7
2 4
3 4
1 4
(4)
2 3 1 4 5 7
2 3
1 3
(5)
2 1 3 4 5 7
1 2
1 2 3 4 5 7
2 4 3 1 5 7
15
Copyright © 2004 - The McGraw - Hill Companies, srl
Algoritmi e strutture dati
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano
BubbleSort (A)
1.
2.
3.
4.
for i=1 to n-1 do
for j=2 to n-i+1 do
if (A[j-1] > A[j]) then scambia A[j-1] e A[j]
if (non ci sono stati scambi) then break
• dopo la i-esima scansione, gli elementi A[n-i+1],…,A[n]
sono correttamente ordinati e sono i più grandi
• linee 3: mette in posizione j il massimo fra A[j-1] e A[j]
• i-esima scansione confronta le prime n-i coppie  il
massimo degli elementi A[1],…,A[n-i+1] è messo in
posizione n-i+1
16
Copyright © 2004 - The McGraw - Hill Companies, srl
Algoritmi e strutture dati
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano
Correttezza
Lemma
Dopo l’i-esima scansione, gli elementi A[n-i+1],…,A[n] sono
correttamente ordinati e occupano la loro posizione definitiva, ovvero:
per ogni h,k, con 1 h  k e n-i+1  k  n, risulta A[h]  A[k]
Dim (Per induzione su i)
Caso i=1
Dopo la prima scansione in A[n] c’è il massimo
Caso i>1
Ipotesi induttiva:
Il massimo fra A[1],…,A[n-i+1]
è messo in posizione n-i+1
A[h]  A[k] per ogni h, k con
A[h]  A[n-i+1]
1 h  k
per ogni h  n-i+1
17
e
n-i+2  k  n
Copyright © 2004 - The McGraw - Hill Companies, srl
Algoritmi e strutture dati
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano
Complessità
BubbleSort (A)
1.
for i=1 to n-1 do
2.
for j=2 to n-i+1 do
3.
if (A[j-1] > A[j]) then scambia A[j-1] e A[j]
4.
if (non ci sono stati scambi) then break
n-i
confronti
e al più
n-i
scambi
n-1
T(n) =  (n-i) =  (n2)
i=1
Complessità
nel caso migliore?
18
Tbest(n)=  (n)
(quando l’array è già ordinato)
Copyright © 2004 - The McGraw - Hill Companies, srl