Informatica! Appunti dal laboratorio 5! Esercizio! • Scrivere un programma che, data una sequenza di interi (scelta dall’utente), la ordini in ordine crescente! Soluzione 1: Selection sort! • Gli algoritmi che sono soluzioni per i problemi di “ordinamento” si chiamano algoritmi di “ordinamento” o “sorting”.! • L’algoritmo “selection sort” funziona come segue:! 1. si seleziona il primo numero della sequenza e lo si confronta con i numeri successivi;! 2. ogni volta che si trova un numero più piccolo, i due numeri vengono scambiati di posto, e il confronto con la sequenza prosegue col nuovo numero in prima posizione;! 3. alla fine di questa serie di confronti, in prima posizione ci sarà il numero più piccolo della sequenza! 4. si ripetono i passi 1-3 per il numero in seconda posizione, in terza, … fino alla fine! 5. alla fine la sequenza è ordinata in maniera crescente! 3 Codice Selection Sort (1)! #include <iostream>! using namespace std;! int main(){! !int d,i,j,z;! !cout << “quanti numeri vuoi inserire?\n”;! !cin >> d;! !int v[d];! !cout << “inserisci i numeri\n”;! !for (int i = 0; i < d; i++)! ! !cin >> v[i]; ! !//inserimento dei numeri in un array! ! 4 Codice Selection Sort (2)! !for (i = 0; i < d; i++) //ciclo per ripetere i passi 1-3! ! !for (j = i; j < d; j++) //ciclo per confrontare l’i-esimo numero ! ! ! ! ! ! ! !//con tutti quelli successivi a lui nella sequenza! ! ! !if (v[i] > v[j]){! ! ! ! !z = v[i];! ! ! ! !v[i] = v[j];! ! ! ! !v[j] = z; //scambio se v[i] è maggiore! ! ! !}! !cout << “ecco la sequenza ordinata:\n”;! !for (i = 0; i < d; i++)! ! !cout << v[i] << “ ”;! !system(“PAUSE”); !return 0;! }! ! 5 Soluzione 2: Bubble sort! • L’algoritmo “bubble sort” fa emergere come bolle i numeri più grandi e funziona come segue:! 1. si confrontano i primi 2 numeri e se il secondo è più piccolo del primo, si scambiano;! 2. si ripete il passo 1 per il secondo e terzo numero, per il terzo e quarto, e così via fino alla fine! 3. si ripetono i passi 1-2 per tante volte quanti sono i numeri nella sequenza (per essere sicuri che la sequenza sia ordinata)! 6 Codice Bubble Sort (1)! #include <iostream>! using namespace std;! int main(){! !int d,i,j,z;! !cout << “quanti numeri vuoi inserire?\n”;! !cin >> d;! !int v[d];! !cout << “inserisci i numeri\n”;! !for (int i = 0; i < d; i++)! ! !cin >> v[i]; ! !//inserimento dei numeri in un array! ! 7 Codice Bubble Sort (2)! !for (i = 0; i < d; i++) //ciclo per ripetere i passi 1-2 d volte! ! !for (j = 0; j < d-1; j++) //ciclo per confrontare il j-esimo numero ! ! ! ! ! ! ! ! ! ! ! ! ! ! !//con quello successivo e eventualmente ! !//scambiarli! ! ! !if (v[j] > v[j+1]){! ! ! ! !z = v[j];! ! ! ! !v[j] = v[j+1];! ! ! ! !v[j+1] = z; //scambio se v[j] > v[j+1]! ! ! !}! !cout << “ecco la sequenza ordinata:\n”;! !for (i = 0; i < d; i++)! ! !cout << v[i] << “ ”;! !system(“PAUSE”); !return 0;! }! 8 Possibile miglioramento ! • Sia nel Selection sort, sia nel Bubble sort le operazioni di ordinamento vengono ripetute un numero fisso di volte, che dipende dalla dimensione della sequenza di numeri! • Nel Bubble sort in certi casi tali ripetizioni sono inutili (immaginate di ricevere una sequenza già in ordine crescente)! • Il Bubble sort può essere modificato inserendo una variabile booleana che diventa vera quando durante un ciclo di confronti non viene effettuato nessuno scambio (il che significa che la sequenza è ordinata); le ripetizioni nel Bubble sort devono continuare finché tale variabile risulta falsa; in questo modo alla peggio facciamo tante ripetizioni quante nella versione attuale dell’algoritmo, ma nei casi più fortunati possiamo terminare prima.! • Una tale modifica non è possibile nel Selection sort perché in un suo ciclo non confrontiamo tra di loro i vari numeri della sequenza, ma un solo numero con tutti gli altri: se anche non ci sono scambi non possiamo dire che la sequenza sia già in ordine (ma solo che il numero selezionato è il più piccolo).!