Fondamenti di Informatica C Lezione 14: Algoritmi fondamentali 5-11-2007 Selection sort: l’algoritmo più stupido ÖCercare l’elemento più piccolo ÖMetterlo al primo posto ÖCercare l’elemento più piccolo fra quelli rimasti ÖMetterlo al secondo posto ÖCercare l’elemento più piccolo fra quelli rimasti ÖMetterlo al terzo posto ÖCercare l’elemento più piccolo fra quelli rimasti ÖMetterlo al quarto posto Ö… Lezione 14: Algoritmi fondamentali 5-11-2007 2 Selection Sort void selection_sort (int a[ ], int N) { int i, j, min, t; for (i=1; i<N; i++) { min=i; for ( j=i+1; j<=N; j++) if (a[j]<a[min] ) min=j; t=a[min]; a[min]=a[i]; a[i]=t; } } Selection_sort Lezione 14: Algoritmi fondamentali 5-11-2007 3 Insertion Sort void insertion_sort (int a[ ],int N) { int i,j,v; a[0] = INT_MIN; for (i=2; i<=N; i++) { v=a[i]; j=i; while ( a[j-1]>v) { a[j]=a[j-1]; j--; } a[j]=v; } } Insertion_sort Lezione 14: Algoritmi fondamentali 5-11-2007 4 Bubble Sort void bubble_sort (int a[],int N) { int i, j, t; for (i=N; i>=1; i--) for (j=2; j<=i; j++) if ( a[j-1]>a[j] ) { t=a[j-1]; a[j-1]=a[j]; a[j]=t; } } Bubble_sort Lezione 14: Algoritmi fondamentali 5-11-2007 5 Quicksort 1. Prendere un elemento a caso (ad esempio l’ultimo a destra) elemento pivot 2. Mettere tutti gli elementi minori alla sua sinistra e tutti quelli maggiori alla sua destra A questo punto l’elemento in questione è al posto giusto 3. Ripetere sugli elementi alla sua sinistra 4. Ripetere sugli elementi alla sua destra quick_sort Lezione 14: Algoritmi fondamentali 5-11-2007 6 Per capire gli algoritmi di ordinamento ÖMolti siti sull’internet z z http://www.cs.ubc.ca/spider/harrison/Java/sorting-demo.html http://www-ihm.lri.fr/~thomas/VisuTri/ Lezione 14: Algoritmi fondamentali 5-11-2007 7 Alcune altre considerazioni sugli algoritmi ÖPer qualunque problema computabile esistono infiniti algoritmi risolutivi ÖNoi non studiamo la complessità computazionale dei nostri algoritmi ÖPerò io cerco di darvi un’idea qualitativa del loro costo ÖIl costo può essere valutato in relazione a diversi parametri, ad es. z z Tempo di calcolo occorrente Occupazione di memoria ÖOttimizzare rispetto a un parametro in genere significa spendere rispetto ad un altro Lezione 14: Algoritmi fondamentali 5-11-2007 8 Ad esempio: ÖInsertion sort usa la minima quantità di memoria indispensabile, ma è lento ÖQuicksort è veloce, ma usa molta più memoria. Perché? z Perché, essendo ricorsivo, occorre creare molte istanze della funzione. Se le cose non sono fatte bene può addirittura “esplodere” e richiedere una profondità di ricorsione pari al numero di elementi del vettore. Lezione 14: Algoritmi fondamentali 5-11-2007 9 Considerazioni generali sugli algoritmi ÖBubble sort effettua all’incirca N2/2 confronti ed N2/2 scambi, sia in media che nel caso peggiore Ö Selection sort effettua all’incirca N2/2 confronti ed N scambi per ogni i da 1 a N -1 c’è uno scambio ed N-1 confronti per un totale di N-1 scambi e (N-1)+(N-2) +…+2+1=N(N-1)/2 indipendentemente dai dati in ingresso. L’aggiornamento della variabile min dipende dai dati in ingresso nel caso peggiore il numero è quadratico, mediamente Nlog2N Lezione 14: Algoritmi fondamentali 5-11-2007 10 Considerazioni generali sugli algoritmi Ö Insertion sort effettua in media N2/4 confronti ed N2/4 spostamenti, il doppio nel caso peggiore, lineare nel caso di vettore quasi ordinato Ö Quick sort effettua in media 2Nlog2N confronti ed Nlog2N scambi, esegue N2/2 confronti nel caso peggiore, con sempre circa Nlog2N scambi (se si esegue l’algoritmo su un vettore di N elementi già ordinato, l’algoritmo richiamerà se stesso N volte con vettori di dimensioni decrescenti di un’unità) Lezione 14: Algoritmi fondamentali 5-11-2007 11