Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
0 12 1 3 2 5 3 6 4 1 5 14 6 5 7 17
Algoritmo Ordinamento
1 3 5 5 6 12 14 17 Array Ordinato
Algoritmi di Ordinamento
quicksort insertsort
4
Algoritmi di Ordinamento
quicksort insertsort
5
Ordinamento di un archivio
! Praticamente tutti i metodi elementari ordinano una sequenza di N numeri in O(N2) Insertion Sort : Caso medio (peggiore) O(N2) ( O(N2) ) ! Metodi di ordinamento pi efficienti Quick Sort :Caso medio (peggiore) O(N logN) ( O(N2) ) Merge Sort: Caso medio (peggiore) O(N logN) (O(N logN) ) Note: Algoritmi ordinamento sono ampiamente indipendenti 1. dal tipo di elementi da ordinare; 2. dal verso di ordinamento: crescente o decrescente
Inizia con mano sinistra vuota Prendiamo una carta alla volta dal tavolo Inseriamo carta in posizione corretta mano sinistra
1.! Per inserire correttamente confrontiamo la carta con quelle gi presenti, da destra a sinistra 2.! In qualsiasi momento le carte nella mano sinistra sono ordinate
4.!
5 5 x 2 2 2 2 2 2 2 2 2
2 x 5 5 5 5 5 5 x 4 4 4
8 8 8 8 x x 8 8 5 5 5 5
4 4 4 4 4 4 4 x 8 8 8 x
7 7 7 7 7 7 7 7 7 7 x 8
1 1 1 1 1 1 1 1 1 1 1 1
3 3 3 3 3 3 3 3 3 3 3 3
6 6 6 6 6 6 6 6 6 6 6 6
InsertionSort (A){! n = DimensioneArray(A);! ! for(j = 1; j<n; j++){ ! ! /* inserisce A[j] nella sequenza! ordinata A[0..j-1] */! !x = A[j];! !i = j 1;! !while ((i ! 0) && ! ! !(x < A[i])){! ! A[i+1] = A[i];! ! i = i 1;! !}! ! A[i+1] = x;! }! }!
2 2 2 x 1 1 1 1 1 1 1
4 4 4 2 2 2 2 2 2 2 2
5 5 5 4 4 4 x 3 3 3 3
x 7 7 5 5 5 4 4 4 4 4
8 8 8 7 7 7 5 5 5 5 5
1 1 x 8 8 8 7 7 7 x 6
3 3 3 3 3 x 8 8 8 7 7
6 6 6 6 6 6 6 6 x 8 8
InsertionSort (A){! n = DimensioneArray(A);! ! for(j = 1; j<n; j++){ ! ! /* inserisce A[j] nella sequenza! ordinata A[0..j-1] */! !x = A[j];! !i = j 1;! !while ((i ! 0) && ! ! !(x < A[i])){! ! A[i+1] = A[i];! ! i = i 1;! !}! ! A[i+1] = x;! }! }!
10
Analisi Complessit
! Algoritmo efficiente per dimensione piccola dellarchivio ! Caso medio O(N2) ! Caso peggiore O(N2) ! Intuizione
! Due cicli che iterano su N-1 ( ciclo esterno ) e j-1 ( ciclo interno )
11
c1n c2 ( n ! 1)
c3 (n ! 1)
c4 !
c5 "
n j =2 j
n j =2
(t
! 1)
c6 "
n j =2
(t
! 1)
12
c7 ( n ! 1)
j+
c5 " ( j ! 1) +
j =2
c6 " ( j ! 1) +
j =2
c7 (n ! 1)
13
T (n ) = c1n + c2 (n ! 1) + c3 (n ! 1) + c4 (n ! 1) + 0+ 0+ c4 (n ! 1) + c7 (n ! 1)
14
15
j+
c5 " ( j ! 1) +
j =2
c6 " ( j ! 1) +
j =2
c7 (n ! 1)
16
j=
17
18
T (n ) = 1
( c + c + c )n 2 2 4 5 6 +(c1 + c2 + c3 + 1 c4 ! 1 c5 ! 1 c6 + c7 )n 2 2 2 !c2 ! c3 ! c7
! "(n 2 )
19
Analisi Complessit
Caso Medio, tj=(j+1)/2
! "(n )
20
10
1.! [DIVIDE] Divide la sequenza di n elementi da ordinare in due sottosequenze di n/2 elementi 2.! [IMPERA] Ordina le due sottosequenze in modo ricorsivo utilizzando lalgoritmo Merge Sort 3.! [COMBINA] Fonde le due sottosequenze ordinate per generare la sequenza ordinata.
22
11
23
24
12
25
Algoritmo
Pseudocodice
MergeSort (A,p,r){!
/*q intero piu grande minore di (p+r)/2 */!
if (p < r) {! !
/*q intero piu grande minore di (p+r)/2 */!
! ! ! ! !}! }!
26
13
27
Merge (A,p,q,r){!
/* p"q<r! Procedura assume A[p..q] e A[q+1..r] ordinati */! /*Lungh. Array Dx */! /*Popola array L (left) e R ( right)*/!
n1 = q p + 1; n2 = r q; !
for (i=0;i<n1;i++) /*Copia Array Sx */! ! !L[i]=A[p + i 1]; ! !for (j=0;j<n2;i++) /*Lungh. Array Dx */! ! !R[j]=A[q + j];! L[n1]=R[n2]=MAXINT;/*Sentinella fine ! ! ! ! ! !mazzo*/!
/* continua */!
28
14
Merge (A,p,q,r){!
/* p"q<r! Procedura assume A[p..q] e A[q+1..r] ordinati */! /*Lungh. Array Dx */! /*Popola array L (left) e R ( right)*/!
n1 = q p + 1; n2 = r q; !
for (i=0;i<n1;i++) /*Copia Array Sx */! ! !L[i]=A[p + i 1]; ! !for (j=0;j<n2;i++) /*Lungh. Array Dx */! ! !R[j]=A[q + j];! L[n1]=R[n2]=MAXINT;/*Sentinella fine ! ! ! ! ! !mazzo*/!
/* continua */!
29
Merge (A,p,q,r){!
/* p"q<r! Procedura assume A[p..q] e A[q+1..r] ordinati */! /*Lungh. Array Dx */! /*Popola array L (left) e R ( right)*/!
n1 = q p + 1; n2 = r q; !
for (i=0;i<n1;i++) /*Copia Array Sx */! ! !L[i]=A[p + i 1]; ! !for (j=0;j<n2;i++) /*Lungh. Array Dx */! ! !R[j]=A[q + j];! L[n1]=R[n2]=MAXINT;/*Sentinella fine ! ! ! ! ! !mazzo*/!
/* continua */!
30
15
Merge (A,p,q,r){!
/* p"q<r! Procedura assume A[p..q] e A[q+1..r] ordinati */! /*Lungh. Array Dx */! /*Popola array L (left) e R ( right)*/!
n1 = q p + 1; n2 = r q; !
for (i=0;i<n1;i++) /*Copia Array Sx */! ! !L[i]=A[p + i 1]; ! !for (j=0;j<n2;i++) /*Lungh. Array Dx */! ! !R[j]=A[q + j];! L[n1]=R[n2]=MAXINT;/*Sentinella fine ! ! ! ! ! !mazzo*/!
/* continua */!
31
Merge (A,p,q,r){!
/* p"q<r! Procedura assume A[p..q] e A[q+1..r] ordinati */! /*Lungh. Array Dx */! /*Popola array L (left) e R ( right)*/!
n1 = q p + 1; n2 = r q; !
for (i=0;i<n1;i++) /*Copia Array Sx */! ! !L[i]=A[p + i 1]; ! !for (j=0;j<n2;i++) /*Lungh. Array Dx */! ! !R[j]=A[q + j];! L[n1]=R[n2]=MAXINT;/*Sentinella fine ! ! ! ! ! !mazzo*/!
/* continua */!
32
16
/* continua */! i=j=0;! for (k=p;k"r;k++) /*r-p+1 !if (L[i] " R[j]) {! ! A[k]= L[i];! i = i + 1; !! !} else{! ! A[k]=R[j];! j=j + 1;! ! }! } /* Fine Merge */! !
passi*/!
33
/* continua */! i=j=0;! for (k=p;k"r;k++) /*r-p+1 !if (L[i] " R[j]) {! ! A[k]= L[i];! i = i + 1; !! !} else{! ! A[k]=R[j];! j=j + 1;! ! }! } /* Fine Merge */! !
passi*/!
34
17
Esempio
5 1 0 2 2 8 2 0 3 4 4 7 5 1 6 9 7 3 8 2 9 6 5 2 4 0 8 5 0 7 4 8 7 5 5 2 2 8 5 5 2 2 5 2 8 0 0 4 7 0 4 4 7 1 1 2 9 3 6 2 9 6 1 3 9 9 3 1 9 9 3 2 2 6 6
35
Analisi Complessit
Caso Peggiore
36
18