Algoritmi e Strutture Dati Capitolo 4 Ordinamento
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) Copyright © 2004 - The McGraw - Hill Companies, srl
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’ Copyright © 2004 - The McGraw - Hill Companies, srl
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 Copyright © 2004 - The McGraw - Hill Companies, srl
al generico passo k, A[1],…,A[k] sono già ordinati SelectionSort (A) for k=0 to n-2 do m = k+1 for j=k+2 to n do 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 Copyright © 2004 - The McGraw - Hill Companies, srl
Correttezza Si dimostra facendo vedere che dopo il generico passo k (k=0,…,n-2) si ha: (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 Copyright © 2004 - The McGraw - Hill Companies, srl
Complessità temporale Come misurarla? Numero confronti Numero operazioni (confronti + spostamenti) Numero passi elementari (darà lo stesso risultato del precedente) Copyright © 2004 - The McGraw - Hill Companies, srl
Complessità T(n) = (n-k-1)= k = (n2) Tbest(n)= (n2) SelectionSort (A) for k=0 to n-2 do m = k+1 for j=k+2 to n do if (A[j] < A[m]) then m=j scambia A[m] con A[k+1] n-k-1 confronti n-k operazioni uno scambio n-2 n-1 T(n) = (n-k-1)= k = (n2) k=0 k=1 Complessità nel caso migliore? Tbest(n)= (n2) Copyright © 2004 - The McGraw - Hill Companies, srl
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 Copyright © 2004 - The McGraw - Hill Companies, srl
al generico passo k, A[1],…,A[k] sono già ordinati InsertionSort (A) for k=1 to n-1 do x = A[k+1] for j=1 to k+1 do if (A[j] > x) then break if (j < k+1) then for t=k downto j do A[t+1]= A[t] 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 Copyright © 2004 - The McGraw - Hill Companies, srl
Correttezza Si dimostra facendo vedere che dopo il generico passo k i primi k+1 elementi sono ordinati (fra di loro) 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 banalmente dalla struttura dell’algoritmo. Copyright © 2004 - The McGraw - Hill Companies, srl
T(n) = (k+1) = (n2) Tbest(n)= (n2) Possiamo fare meglio? InsertionSort (A) for k=1 to n-1 do x = A[k+1] for j=1 to k+1 do if (A[j] > x) then break if (j < k+1) then for t=k downto j do A[t+1]= A[t] A[j]=x al più k+1 confronti k+1 operazioni nessun confronto n-1 T(n) = (k+1) = (n2) k=1 Numero di operazioni nel caso migliore? Tbest(n)= (n2) Possiamo fare meglio? Copyright © 2004 - The McGraw - Hill Companies, srl
Caso migliore Caso peggiore Si verifica quando l’array è già ordinato InsertionSort2 (A) for k=1 to n-1 do x = A[k+1] j = k while j > 0 e A[j] > x do A[j+1] = A[j] j= j-1 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) Copyright © 2004 - The McGraw - Hill Companies, srl
Esercizio Dimostrare la correttezza e stimare la complessità temporale nel caso peggiore e nel caso migliore del seguete algoritmo BubbleSort (A) for i=1 to n-1 do scambi= false for j=2 to n-i+1 do if (A[j-1] > A[j]) then scambia A[j-1] e A[j]; scambi=true if (scambi=false) then break Copyright © 2004 - The McGraw - Hill Companies, srl