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.
[/quote]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 loopse 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