Stavo leggendo come creare un algoritmo per ordinare gli elementi di un vettore, ho deciso di aprire questa discussione perché non ho capito una cosa: perché per far si che tra un "vettore[x]" e un "vettore[y]" ci sia uno scambio di valori, c'è bisogno di una terza variabile?
Per esempio (guardate sotto il commento "ordinamento del vettore in ordine crescente"):
- Codice: Seleziona tutto
#include <stdio.h>
/*ordinare gli elementi di un vettore in ordine crescente*/
#define MAX_ELE 99 /*limite del vettore*/
main(void) {
int x, y, n, scambio;
int vettore[MAX_ELE];
do {
printf("Stabilisci la grandezza del vettore (massimo %d): ", MAX_ELE);
scanf("%d", &n);
}while(n<1 || n>MAX_ELE);
printf("\n");
for(x=0; x<n; x++) {
printf("Inserisci il valore in posizione vettore[%2d]: ", x);
scanf("%d", &vettore[x]);
}
/*ordinamento del vettore in ordine crescente*/
for(x=0; x<n; x++) {
for(y=0; y<n; y++) {
if(vettore[x]<vettore[y]) {
scambio = vettore[y];
vettore[y] = vettore[x];
vettore[x] = scambio;
}
}
}
/*visualizzazione*/
printf("\nOrdinamento del vettore in ordine crescente");
for(x=0; x<n; x++) {
printf("\nPosizione vettore[%2d] = %2d", x, vettore[x]);
}
printf("\n");
return 0;
}
Perché per fare in modo che vettore[x] assuma il valore di vettore[y] c'è bisogno di una variabile di appoggio?
All'interno dei cicli for, anziché scrivere
- Codice: Seleziona tutto
scambio = vettore[y];
vettore[y] = vettore[x];
vettore[x] = scambio;
, perché non si può fare direttamente così
- Codice: Seleziona tutto
vettore[y] = vettore[x]
vettore[x] = vettore[y]
?
Se si esegue il ciclo senza la variabile di appoggio le posizioni (posizioni?) dei vettori assumono tutte uno stesso valore (il più minore o il più maggiore, dipende da come si imposta il ciclo), però non ho capito perché...
Comunque l'algoritmo è semplice, il pdf mi proponeva un certo algoritmo chiamato "bubblesort", però non ci ho capito molto... tuttavia da esso ne ho tratto spunto e ne è uscito fuori quello che ho postato sopra.
In pratica funziona così: ci sono due cicli for. Il ciclo esterno e il ciclo interno vengono ripetuti per uno stesso valore chiamato "n".
All'avvio dei cicli, "x" assume il valore 0 dopodiché inizia il ciclo interno e, ogni volta che il ciclo interno termina, viene incrementato il valore della variabile "x" del ciclo più esterno. I cicli termineranno fin quando "x" non sarà più minore di "n".
Detto ciò, facciamo che "n" valga 5 e che nel vettore inseriamo i seguenti valori: 4,5,6,7,2.
All'avvio dei cicli, avremo che vettore[x] = 4, mentre vettore[y] sarà prima 4, poi 5, poi, 6, poi 7 e infine 2.
L'"if" ci dice che se vettore[x]<vettore[y] allora avviene lo scambio di valori.
Avremo che... per esempio, la prima interazione sarà così:
vettore[0]di_x (che contiene 4) si confronterà con vettore[0]di_y (che anch'esso contiene 4). Poiché sono uguali non ci sarà nessun scambio. Dopodiché, "y" (che fa parte del ciclo interno) prosegue con l'interazione e diventa 1. Nel vettore[1] abbiamo come valore 5. Quindi, vettore[0]di_x, essendo minore di 5, scambierà il proprio valore con vettore[1]di_y. Dopo ciò, avremo che vettore[0]di_x avrà il valore di 5 mentre vettore[1]di_y avrà il valore di 4.
"y" prosegue con l'incremento e assume il valore di 2. Vettore[2] ha il valore di di 6. vettore[0]di_x (che adesso vale 5) è minore di vettore[2]di_y. Si effettua un altro scambio e avremo che vettore[0]di_x = 6, mentre vettore[2]di_y = 5. E così via...
Quando i due cicli termineranno il primo avvio, il vettore avrà i valori nell'ordine di: 7,4,5,6,2. In pratica, nel primo avvio, il numero maggiore se lo porta in cima, per poi scalarlo man mano ad ogni ripetizione, mentre i valori minori saliranno in alto.
Per esempio la seconda ripetizione termina con i valori del vettore ordinati così: 4,7,5,6,2. Il motivo spero di averlo saputo spiegare.
E' più facile da capire che spiegare...
Comunque però non credo che questo algoritmo vada bene. Il pdf parlava di algoritmi che interrompono i cicli for non appena i valori del vettore sono ordinati nella maniera desiderata. Con l'algoritmo sopracitato i cicli for devono per forza completare tutti gli incrementi (credo che approfondirò in seguito). Per adesso vorrei avere solo una risposta alla domanda sopracitata.

Elettrotecnica e non solo (admin)
Un gatto tra gli elettroni (IsidoroKZ)
Esperienza e simulazioni (g.schgor)
Moleskine di un idraulico (RenzoDF)
Il Blog di ElectroYou (webmaster)
Idee microcontrollate (TardoFreak)
PICcoli grandi PICMicro (Paolino)
Il blog elettrico di carloc (carloc)
DirtEYblooog (dirtydeeds)
Di tutto... un po' (jordan20)
AK47 (lillo)
Esperienze elettroniche (marco438)
Telecomunicazioni musicali (clavicordo)
Automazione ed Elettronica (gustavo)
Direttive per la sicurezza (ErnestoCappelletti)
EYnfo dall'Alaska (mir)
Apriamo il quadro! (attilio)
H7-25 (asdf)
Passione Elettrica (massimob)
Elettroni a spasso (guidob)
Bloguerra (guerra)








