Capitolo 4 Ordinamento Algoritmi e Strutture Dati Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano
Algoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 2 Dato un insieme S di n oggetti presi da un dominio totalmente ordinato, ordinare S Ordinamento Subroutine in molti problemi E possibile effettuare ricerche in array ordinati in tempo O(log n) Esempi: ordinare una lista di nomi alfabeticamente, o un insieme di numeri, o un insieme di compiti desame in base al cognome dello studente
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 3 Il problema dellordinamento Input: una sequenza di n numeri Output: una permutazione (riarrangiamento) della sequenza di input tale che a 1 a 2 … a n
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 4 InsertionSort Approccio incrementale: estende lordinamento da k a k+1 elementi, posizionando lelemento (k+1)-esimo nella posizione corretta rispetto ai primi k elementi
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 5 InsertionSort (A) 1. for k=1 to n-1 do 2. x = A[k+1] 3. for j=1 to k+1 do 4. if (A[j] > x) then break 5. 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
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 6 Correttezza Si dimostra facendo vedere che dopo il generico passo k i primi k+1 elementi sono ordinati Induzione su k: –k=0: banale. Allinizio il primo elemento è ordinato –k>0. Allinizio del passo k i primi k elementi sono ordinati (ipotesi induttiva). Allora la tesi segue dalla struttura dellalgoritmo.
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 7 Complessità temporale Come misurarla? –Numero confronti –Numero operazioni (confronti + spostamenti)
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 8 InsertionSort (A) 1. for k=1 to n-1 do 2. x = A[k+1] 3. for j=1 to k+1 do 4. if (A[j] > x) then break 5. if (j < k+1) then 6. for t=k downto j do A[t+1]= A[t] 7. A[j]=x T(n) = (k+1) = (n 2 ) al più k+1 confronti nessun confronto k+1 operazioni k=1 n-1 Numero di operazioni nel caso migliore? T best (n)= (n 2 ) Possiamo fare meglio?
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 9 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 larray è già ordinato –T best (n)= (n) Caso peggiore –array ordinato in ordine decrescente –T(n)= (n 2 )
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 10 SelectionSort Approccio incrementale: estende lordinamento da k a k+1 elementi, scegliendo il minimo degli n-k elementi non ancora ordinati e mettendolo in posizione k+1
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 11 SelectionSort (A) 1. for k=0 to n-2 do 2. m = k+1 3. for j=k+2 to n do 4. if (A[j] < A[m]) then m=j 5. 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 è lindice dellarray in cui si trova il minimo il minimo è messo in posizione k+1
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 12 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 dellarray Induzione su k: –k=0: banale. Allinizio il primo elemento è il minimo. (i) e (ii) banalmente verificate. –k>0. Allinizio del passo k i primi k elementi sono ordinati e sono i k elementi più piccoli nellarray (ipotesi induttiva). Allora la tesi segue dal fatto che lalgoritmo seleziona il minimo dai restanti n-k elementi e lo mette in posizione k+1. Infatti: (ii) i k+1 elementi restano i minimi nellarray (i) lelemento in posizione k+1 non è mai più piccolo dei primi k
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 13 Complessità SelectionSort (A) 1. for k=0 to n-2 do 2. m = k+1 3. for j=k+2 to n do 4. if (A[j] < A[m]) then m=j 5. scambia A[m] con A[k+1] n-k-1 confronti uno scambio n-k operazioni T(n) = (n-k-1) = (n 2 ) k=0 n-2 Complessità nel caso migliore? T best (n)= (n 2 )
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 14 BubbleSort Esegue una serie di scansioni dellarray –In ogni scansione confronta coppie di elementi adiacenti, scambiandoli se non sono nellordine corretto –Dopo una scansione in cui non viene effettuato nessuno scambio larray è ordinato Idea: dopo la k-esima scansione, i k elementi più grandi sono correttamente ordinati ed occupano le k posizioni più a destra
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 15 Esempio di esecuzione
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 16 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 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
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 17 Correttezza Lemma Dopo li-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: A[h] A[k] per ogni h, k con 1 h k e n-i+2 k n Il massimo fra A[1],…,A[n-i+1] è messo in posizione n-i+1 A[h] A[n-i+1] per ogni h n-i+1
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 18 Complessità n-i confronti e al più n-i scambi T(n) = (n-i) = (n 2 ) i=1 n-1 Complessità nel caso migliore? T best (n)= (n) 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 (quando larray è già ordinato)