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