Due elementi
Scambiare i valori contenuti nell’array v alle posizioni a e b
void SCAMBIA(double v[], int a, int b) { double temp=v[a]; v[a]=v[b]; v[b]=temp; }
Ordinare un array di due elementi
if(v[0] > v[1]) SCAMBIA(v, 0, 1);
oppure…
if(v[0] > v[1]) { double temp=v[0]; v[0]=v[1]; v[1]=temp; }
Ordinare un sottoarray di due elementi
if(v[pos] > v[pos+1]) SCAMBIA(v, pos, pos+1);
Bubble sort
Una passata su tutte le n-1 coppie, all’interno di un array, provoca lo spostamento in alto della bolla più grande
for(int j=0; j < v.length-1; j++) if(v[j] > v[j+1]) SCAMBIA(v, j, j+1);
Cioè l’elemento più grande si trova in ultima posizione alla fine della passata.
N passate, sulle n-1 coppie, ordinano sicuramente l’array
void BUBBLESORT(double v[]) { int n=v.length; for(int i=0; i < n; i++) for(int j=0; j < n-1; j++) if(v[j] > v[j+1]) SCAMBIA(v, j, j+1); }
In realtà sono necessarie al massimo n-1 passate su n-i coppie
void BUBBLESORT(double v[]) { int n=v.length; for(int i=0; i < n-1; i++) for(int j=0; j < n-i-1; j++) if(v[j] > v[j+1]) SCAMBIA(v, j, j+1); }
Selection sort
Si può individuare il valore minimo nell’array e scambiarlo con il valore alla posizione 0 (in questo modo l’elemento alla posizione 0 occupa il posto che gli spetta…)
int posMin=0; for(int j=1; j < n; j++) if(v[j] < v[posMin]) posMin=j; SCAMBIA(v, 0, posMin);
Ripetendo la stessa operazione con il sottovettore
- da 1 a n-1
- da 2 a n-1
- ...
- da n-2 a n-1
sarà al suo posto l'elemento alla posizione
- 1
- 2
- ...
- n-2
L'elemento alla posizione n-1 occuperà necessariamente l'unico posto rimasto...
void SELESORT(double v[]) { int n=v.length; for(int i=0; i < n-1; i++) { int posMin=i; for(int j=i+1; j < n; j++) if(v[j] < v[posMin]) posMin=j; SCAMBIA(v, i, posMin); } }