Insertion sort:loop
Salve a tutti,
ho provato ad implementare in c l'algoritmo dell'Insertion sort e il programma che ho creato va sempre il loop. Potete aiutarmi a capire dov'è l'errore, perchè io non riesco a trovarlo?
grazie
ho provato ad implementare in c l'algoritmo dell'Insertion sort e il programma che ho creato va sempre il loop. Potete aiutarmi a capire dov'è l'errore, perchè io non riesco a trovarlo?
grazie
//INSERTION SORT #include<stdio.h> #include<stdlib.h> #define SIZE 6 void stampa(int v[]); int main() { int v[SIZE]; int j=1, x, i, a; for(i=0; i<SIZE; i++) { printf("\n Inserire la componente %d del vettore", i); scanf("%d", &a); v[i]=a; } for(j=1; j<SIZE; j++) { x=v[j]; i=j-1; while((i >= 0)&& (v[i] > x)) { v[i+1]=v[i]; i=i--; } v[i+1]=x; } printf("\n Il vettore ordinato è "); stampa(v); system("PAUSE"); return 0; } void stampa(int v[]) { int i; for(i=0; i<SIZE; i++) printf(" %d ", v[i]); }
Risposte
i=i--;sicuramente questo non è bellissimo, stai assegnando ad i il valore di i prima del decremento ergo è un'identità, cioè è come se non avessi fatto i--
Ciao,
sbagli completamente indicizzazione di $i$ nel ciclo for, e poi c'è un'uguaglianza sbagliata.
prova così
è corretto dire che è una cosa inutile, ma non è come non avvenisse l'assegnazione;
se si srotolola la funzione:
$i = i = i-1;$
praticamente avviene una doppia assegnazione, ma $i-1$ viene fatta e salvata due volte.
sbagli completamente indicizzazione di $i$ nel ciclo for, e poi c'è un'uguaglianza sbagliata.
for(j=1; j<SIZE; j++) { x=v[j]; i=j; while((i > 0)&& (v[i-1] > x)) { v[i]=v[i-1]; i--; } v[i]=x; }
prova così

"cyd":i=i--;
sicuramente questo non è bellissimo, stai assegnando ad i il valore di i prima del decremento ergo è un'identità, cioè è come se non avessi fatto i--
è corretto dire che è una cosa inutile, ma non è come non avvenisse l'assegnazione;
se si srotolola la funzione:
$i = i = i-1;$
praticamente avviene una doppia assegnazione, ma $i-1$ viene fatta e salvata due volte.

Funziona benissimo grazie!!!!
"ham_burst":
[quote="cyd"]i=i--;
sicuramente questo non è bellissimo, stai assegnando ad i il valore di i prima del decremento ergo è un'identità, cioè è come se non avessi fatto i--
è corretto dire che è una cosa inutile, ma non è come non avvenisse l'assegnazione;
se si srotolola la funzione:
$i = i = i-1;$
praticamente avviene una doppia assegnazione, ma $i-1$ viene fatta e salvata due volte.

invece no, assegni ad i il valore di ritorno di i-- che è i, ciò che dici tu ha senso per questa espressione:
i=--i
infatti prova ad eseguire
#include<stdio.h> int main(){ int i=9; while(i>0){ i=i--; } return 0; }vedrai che non finisce mai il loop
se invece sostituisci con i=--i finisce con un'istrizione ridondante ogni ciclo
@Fravilla: prego 
@cyd: ah ecco, avevo un piccolo dubbio che fosse questo secondo caso quello corretto, sorry. Hai fatto molto bene a farlo notare

@cyd: ah ecco, avevo un piccolo dubbio che fosse questo secondo caso quello corretto, sorry. Hai fatto molto bene a farlo notare
