Insertion sort:loop

Fravilla1
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

//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
cyd1
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--

hamming_burst
Ciao,
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. :-)

Fravilla1
Funziona benissimo grazie!!!!

cyd1
"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 loop
se invece sostituisci con i=--i finisce con un'istrizione ridondante ogni ciclo

hamming_burst
@Fravilla: prego :-)

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

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.