Lezione 18 (18 aprile 2012) ordinamenti

Download Lezione 18 (18 aprile 2012)   ordinamenti

Post on 06-Dec-2014

663 views

Category:

Documents

2 download

Embed Size (px)

DESCRIPTION

 

TRANSCRIPT

<ul><li> 1. Abilit Informatiche Ingegneria ChimicaLezione 18 del 18/04/2012 Prof. Antonino Stelitano </li> <li> 2. Docente Antonino StelitanoTutorLezioni Luned 14:00 17:30 aula 16 Mercoled 15:45 19:00 aula 15 Lab. Paolo Ercoli via Tiburtina 205Ricevimento: Per appuntamento antonino.stelitano@uniroma1.it stelitano.a@libero.itSito web: http://w3.uniroma1.it/ab_informatiche </li> <li> 3. Algoritmi di ordinamento Gli algoritmi di ordinamento hanno lo scopo di organizzare un insieme secondo una relazione dordine stabilita. Il caso degli algoritmi di ordinamento particolarmente interessante, perch siamo di fronte ad algoritmi che fanno la stessa cosa, ma con complessit diversa. La complessit proporzionale alle dimensioni del problema, in questo caso al numero n degli elementi che dobbiamo ordinare. Vedremo due algoritmi di ordinamento: Ordinamento per selezione (o Selection Sort) Ordinamento a bolle (o Bubble Sort) 3 </li> <li> 4. Selection Sort LAlgoritmoI passi da seguire sono i seguenti :1) Posizionamento sul primo elemento dellarray2) Ricerca dellelemento pi grande e scambio con il primo elemento dellarray3) Posizionamento sul secondo elemento dellarray4) Ricerca dellelemento pi grande tra gli N-1 elementi rimasti e scambio con il secondo elemento dellarray5) Posizionamento sul terzo elemento dellarray6) Ricerca dellelemento pi grande tra gli N-2 elementi rimasti e scambio con il terzo elemento dellarray7) Tale procedimento viene ripetuto N-1 volteOsservazione : Per implementare lAlgoritmo abbiamo bisogno di 2 indici : Uno che tiene conto della posizione in cui si trova lelemento da ordinare ( primo, secondo, terzo, ) Uno che permette di scorrere larray alla ricerca del valore maggiore A.Pi </li> <li> 5. Ordinamento per selezioneEsempio b d a cvettore APasso 1 d b a c d c a bPasso 2 d c b aPasso 3 A.Pi </li> <li> 6. Ordinamento per selezione(selection sort) Funzionamento generale cerca nellarray ancora da ordinare lelemento minimo porta tale elemento nella prima posizione dellarray ancora da ordinare 20 35 18 8 14 41 3 39 3 35 18 8 14 41 20 39 6 </li> <li> 7. Ordinamento per selezione (selection sort) 20 35 18 8 14 41 3 39 3 35 18 8 14 41 20 39 Quindi, per tutti gli elementi dellarray: si cerca il primo elemento minimo e lo si porta in prima posizione, cio in a[0] si cerca il secondo elemento minimo e lo si porta in seconda posizione, cio in a[1] si cerca il terzo elemento minimo e lo si porta in seconda posizione, cio in a[2] si cerca il k-esimo elemento minimo e lo si porta in k-esima posizione, cio in a[k] Si procede cos fino a che tutti gli elementi sono ordinati 7 </li> <li> 8. Ordinamento per selezione (selection sort) Lindividuazione dellelemento minimo avviene scandendo tutto larray (parte non ancora ordinata dellarray) Prima della prima iterazione va inizializzata la variabile min si assegna a min il primo elemento dellarray a[0] Per tutti gli elementi confronta min con lelemento corrente a[i] se a[i] minore di min, poni a[i] in min Scambia min con a[i] 20 35 18 8 14 41 3 39 Dobbiamo memorizzare lindice del minimo 8 </li> <li> 9. Algoritmo di ricerca del minimo min= a[0] i_min=0 for (j = 1; j &lt; n; j++) if (a[j] &lt; min) { min= a[j]; i_min=j; } Scambio di min e a[0] a[i_min] = a[0]; a[0]= min; 9 </li> <li> 10. La ricerca deve essere ripetuta per cercare il secondo elemento minimo, poi il terzo, il quarto, etc. fino ad arrivare allelemento (n-1) che a quel punto sar automaticamente ordinato la ricerca del secondo elemento avverr a partire dal secondo elemento (il primo gi ordinato) la ricerca del terzo elemento avverr a partire dal terzo elemento quindi se ho ordinato i elementi cerco lelemento pi piccolo a partire dallelemento i+1 ad ogni iterazione cerco il minimo che sposto in posizione (i+1)-esima 10 </li> <li> 11. Per tutti gli elementi a[i] del vettore min= a[i] cerca il minimo a partire dellelemento a[i+1] nella parte non ordinata da (i+1) alla fine del vettore) cerca lelemento pi piccolo confrontandolo con min quando individuato scambialo con min e memorizza la sua posizione i_min scambia min con a[i] Lultimo elemento automaticamente ordinato, ciclo esterno da 0 a n-2 ciclo interno a partire i+1 fino a n-1 Per evitare un certo numero di assegnazioni, non memorizziamo il minimo in min, tanto abbiamo il suo indice 11 </li> <li> 12. void SelectionSort (int A[ ], int n){ int i, j , i_min; int temp; for (i=0; i &lt; n-1; i++) { i_min = i; /* cerca il minimo nella parte non ordinata */ for (j = i+1; j&lt; n ; j++) if (A[j] &lt; A[i_min]) i_min=j; if (i != i_min) { temp = A[i_min]; A[i_min] = A[i]; A[i] = temp; } }} 12 </li> <li> 13. Complessit selection sort Istruzione dominante Istruzione ripetuta pi volte for (i = 0; i &lt; n-1; i++) {... for (j =i+1; j&lt; n ; j++) if (A[j] &lt; A[i_min]) i_min=j; . Il corpo del for esterno viene eseguito n -1 (ordine di n) Il for interno viene eseguito circa n volte per ogni ciclo esterno Complessit: O(n2) I cicli sono eseguiti un numero di volte che non dipende dalla particolare configurazione dei dati di ingresso. stesso costo per ogni possibile configurazione dei dati di ingresso; O(n2) anche se larray gi completamente ordinato 13 </li> <li> 14. Ordinamento a bolle (Bubble Sort) Si basa sul confronto (ed eventuale scambio) successivo di due elementi contigui in cui il pi leggero viene spinto indietro (indice pi basso) Confronto tra le ultime due posizioni (n-1 e n-2) si muove indietro il pi leggero (verso indice pi basso) lelemento pi piccolo viene spinto in prima posizione Alla fine della prima scansione (sono stati analizzati n elementi) stato ordinato un elemento: lelemento pi leggero (che si trova in posizione 0) Rimangono da ordinare gli altri (n-1) elementi. Non considero pi lelemento ordinato 14 </li> <li> 15. Ordinamento a bolle (Bubble Sort) Literazione del procedimento porter in seconda posizione (indice 1) il successivo elemento pi leggero Rimangono gli ultimi (n-2) ancora da ordinare. La ripetuta applicazione di questa procedura porter allordinamento totale dellarray. Due cicli: un ciclo esterno: viene cercato lelemento i da spostare indietro. Si devono ancora ordinare (n-i) elementi un ciclo interno: che scorre la porzione di array alla ricerca dellelemento pi leggero. Il metodo degli scambi ripetuti garantisce che ad ogni passaggio sia ordinato un elemento --&gt; per n elementi, servono n-1 passaggi 15 </li> <li> 16. 30 12 18 8 14 41 3 3930 12 18 8 14 41 3 3930 12 18 8 14 3 41 3930 12 18 8 3 14 41 3930 12 18 3 8 14 41 3930 12 3 18 8 14 41 3930 3 12 18 8 14 41 393 30 12 18 8 14 41 39 16 </li> <li> 17. Iterando su tutta la lunghezza dellarray (meno 1 perch lultimo elemento automaticamente ordinato) (for ( i=0; i &lt; n-1 ; i++)) Per tutte le coppie contigue dellarray (a partire j=n-2 e j=n-1) Se la coppia corrente non ordinata, scambia tra loro gli elementi if (a[j] &lt; a[j-1]) scambia la coppia Loop interno: deve operare solo sulla parte che non ancora ordinata legato al ciclo esterno: varia da n-1 a i (dove i e lindice del ciclo esterno) 17 </li> <li> 18. void BubbleSort (int A[ ], int n) { int i, j; int temp; for (i =0 ; i &lt; n-1; i++) for (j = n-1 ; j &gt; i ; j--) if (A[j] &lt; A[j-1]) { temp = A[j]; A[j] = A[j-1]; A[j-1] = temp; }} 18 </li> <li> 19. Algoritmo ottimizzato Larray pu risultare ordinato prima della fine del ciclo esterno. Si pu inserire un controllo per evitare di fare operazioni inutili: controllo di una variabile booleana legata allavvenuto scambio di elementi quando una scansione dellarray non causa nessuno scambio, vuol dire che larray ordinato. alla fine di ogni ciclo interno, si controlla il valore della variabile booleana per verificare se allinterno della scansione siano stati o meno effettuati scambi. 19 </li> <li> 20. Algoritmo ottimizzatoDescrizione dellalgoritmo: Finch larray non ancora ordinato trovato=1 per tutte le coppie contigue nella parte dellarray non ordinata se la coppia di elementi di elementi non ordinata scambiare gli elementi della coppia trovato = 0 20 </li> <li> 21. Algoritmo Bubble Sort ottimizzatovoid BubbleSort (int A[ ], int n){ int i=0, j, temp, ordinato; do { ordinato = 1; for (j = n-1 ; j &gt; i ; j--) if (A[j] &lt; A[j-1]) { temp = A[j]; A[j] = A[j-1]; A[j-1] = temp; ordinato = 0; } i++; } while (!ordinato &amp;&amp; i &lt; n-1);} 21 </li> <li> 22. Complessit bubble sort Dipende dalla configurazione dei dati di ingresso. Caso migliore se larray di ingresso fosse gi ordinato lalgoritmo compirebbe una sola scansione con nessuno scambio costo di esecuzione: O(n). Caso peggiore sono necessarie n - 1 fasi per completare la sua esecuzione (il vettore ordinato in senso inverso) Proporzionale a n il ciclo interno costo di esecuzione: O(n2) Si noti che O(n2) solo nel caso peggiore, mentre il selection sort sempre O(n2) 22 </li> </ul>

Recommended

View more >