Info LAB 05

annuncio pubblicitario
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).!
Scarica