Sei sulla pagina 1di 17

Ordinamento di un archivio

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

shellsort bubblesort selectionsort mergesort

quicksort insertsort
4

Algoritmi di Ordinamento

shellsort bubblesort selectionsort mergesort

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

Algoritmo Insertion Sort


! Algoritmo efficiente per dimensione piccola dellarchivio ! Simile a quello usato da giocatori per ordinare carte
1.! 2.! 3.!

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.!

Si preleva carta dal tavolo finch mazzo carte non vuoto

Algoritmo Insertion Sort


PseudoCodice 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;! !}! 8 }!

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

Analisi Complessit (1)


InsertionSort (A){! n = DimensioneArray(A);! ! !for(j = 1; j<n; j++){ ! ! !x = A[j];! ! ! !i = j 1;! ! !while ((i ! 0) &&! ! ! ! (x < A[i])){! ! ! !A[i+1] = A[i];! ! ! ! !i = i 1;! ! !}! ! ! !A[i+1] = x;! !}! }!

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)

Analisi Complessit (2)


T (n) = c1n + c2 (n ! 1) + c3 (n ! 1) + c4 "
n j =2 n

j+

c5 " ( j ! 1) +
j =2

c6 " ( j ! 1) +
j =2

c7 (n ! 1)
13

Analisi Complessit (1)


Caso migliore, tj=1

T (n ) = c1n + c2 (n ! 1) + c3 (n ! 1) + c4 (n ! 1) + 0+ 0+ c4 (n ! 1) + c7 (n ! 1)
14

Analisi Complessit (2)


Caso migliore, tj=1

T (n ) = (c1 + c2 + c3 + c4 + c7 )n !c2 ! c3 ! c4 ! c7 = bn + a " #(n )

15

Analisi Complessit (1)


Caso Peggiore, tj=j

T (n) = c1n + c2 (n ! 1) + c3 (n ! 1) + c4 "


n j =2 n

j+

c5 " ( j ! 1) +
j =2

c6 " ( j ! 1) +
j =2

c7 (n ! 1)
16

Analisi Complessit (2)


Caso Peggiore, tj=j

Ricorda che: n(n + 1) "1 j =2 2 n n(n " 1) ! j=2 ( j " 1) = 2

j=

17

Analisi Complessit (3)


Caso Peggiore, tj=j

T (n) = c1n + c2 (n ! 1) + c3 (n ! 1) + n(n + 1) ! 1) 2 n(n ! 1) c5 ( )+ 2 n(n ! 1) c6 ( )+ 2 c7 (n ! 1) c4 (

18

Analisi Complessit (4)


Caso Peggiore, tj=j

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

= c ' n2 + b ' n + a '

! "(n 2 )
19

Analisi Complessit
Caso Medio, tj=(j+1)/2

! "(n )

20

10

Indice ! !Algoritmi di Ordinamento !Insertion Sort !Merge Sort

Ordinamento per ricorsione - Merge Sort

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

Ordinamento per ricorsione Merge Sort


Caso Base

23

Ordinamento per ricorsione Merge Sort


Caso Induttivo

24

12

Ordinamento per ricorsione - Merge Sort

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 */!

! ! ! ! !}! }!

!q = Floor((p+r)/2)); ! !MergeSort (A,p,q)! !MergeSort (A,q+1,r)! !Merge(A,p,q,r)!

26

13

Ordinamento per ricorsione - Merge Sort

27

Operazione di merge di array


Pseudocodice

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; !

/*Lungh. Array Sx*/!

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

Operazione di merge di array


Pseudocodice

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; !

/*Lungh. Array Sx*/!

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

Operazione di merge di array


Pseudocodice

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; !

/*Lungh. Array Sx*/!

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

Operazione di merge di array


Pseudocodice

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; !

/*Lungh. Array Sx*/!

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

Operazione di merge di array


Pseudocodice

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; !

/*Lungh. Array Sx*/!

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

Operazione di merge di array (cont.)


Pseudocodice

/* 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

Operazione di merge di array (cont.)


Pseudocodice

/* 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

T ( n ) ! cn " #log 2 n$ % + cn & '(n log(n ))

36

18

Potrebbero piacerti anche