Visualizzazione dei risultati da 1 a 8 su 8

Discussione: [C] bubble sort

  1. #1
    Utente di HTML.it
    Registrato dal
    Mar 2007
    Messaggi
    230

    [C] bubble sort

    Ho scritto questo semplice programma che dovrebbe dare l'ordinamenot con l'algoritmo bubble sort.
    Non ricevo errori di compilazione, il problema sta nel fatto che non riordina gli elementi nel vettore e non riesco a trovare l'errrore.
    Potete aiutarmi? grazie

    Codice PHP:
    void bubblesort(int nelemint array[]);

    int main()
    {     
    int nelem 10;
          
    int i 0;
          
    srand(time(NULL));
          
    int array[nelem];
          
    int m 0;
       for(
    iinelemi++){
       array[
    i]= rand() %100;
       
    printf(" %d", array[i]);
       }
       
    printf("\n");
       
    bubblesort(nelem,array);
       for( 
    mm<nelemm++){
       
    printf(" %d",array[m]);

       }



          
    system("PAUSE");
          return 
    0;
    }


    void bubblesort(int nelemint array[])
    {
      
    int i;
      
    int j 0;
      
    int temp;

     for(
    =i<nelemi++){
          for(
    jnelem -ij++){
             if( array[
    j] > array[j+1]){
                
    temp = array[j];
                array[
    j] = array[j+1];
                array[
    j+1] = temp;
             }
      }


  2. #2
    Ciao Puntino,

    Per la dimensione di un array, non puoi usare una variabile( è strano che non ti dia l'errore in compilazione. A me, il visual studio 2008, dà l'errore "expected constant expression"). Devi usare un valore costante:

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    
    #define MAX_ELEM 10
    
    void bubblesort(int nelem, int *a); 
    void fast_bubblesort(int nelem, int *a);
    
    int main() 
    {
    	//int nelem = 10; 
    	int i = 0; 
    	int a[MAX_ELEM]; 
    	int m = 0; 
    
    	srand((int)time(NULL)); 
    
    	for(i; i < MAX_ELEM; i++)
    	{
    		a[i]= rand() % 100; 
    		printf(" %d", a[i]); 
    	}
    	printf("\n"); 
    
    	//bubblesort(MAX_ELEM, a); 
    	fast_bubblesort(MAX_ELEM, a); 
    
    	for(m = 0; m < MAX_ELEM; m++)
    	{ 
    		printf(" %d", a[m]); 
    	} 
    	printf("\n"); 
    
    	system("PAUSE"); 
    
    	return 0; 
    } 
    
    void bubblesort(int nelem, int *a) 
    {
    	register int i, j, temp;
    
    	for(i = 1; i < nelem; ++i)
    	{
    		for(j = nelem-1; j >= i; --j)
    		{ 
    			if( a[j-1] > a[j] )
    			{ 
    				temp = a[j-1]; 
    				a[j-1] = a[j]; 
    				a[j] = temp; 
    			} 
    		} 
    	}
    }
    
    void fast_bubblesort(int nelem, int *a) 
    {
    	register int i, j;
    
    	for(i = 1; i < nelem; ++i)
    	{
    		for(j = nelem-1; j >= i; --j)
    		{ 
    			if( a[j-1] > a[j] )
    			{ 
    				a[j-1] ^= a[j];
    				a[j] ^= a[j-1];
    				a[j-1] ^= a[j];
    			} 
    		} 
    	}
    }
    La seconda versione dell'algoritmo (funzione fast_bubblesort), è più veloce rispetto alla prima. Utilizza infatti l'operatore XOR del C e si evvita l'utilizzo di una variabile temporanea.


  3. #3
    Utente di HTML.it L'avatar di LexLex
    Registrato dal
    May 2008
    Messaggi
    56
    nella funzione bubblesort manca la chiusura della parentesi.. ma sarà un errore di copia,
    secondo me invece quello che non ti fa "funzionare la funzione" è l'inizializzazione nei for che tu fai in un modo un pò stravagante:

    for(i; i < MAX_ELEM; i++)

    io farei il classicissimo:

    for(i = 0 ; i < MAX_ELEM; i++).

    Ciao.
    "Dai Diamanti non nasce niente, dal letame nascono i fiori.. " F.De Andrè

  4. #4
    Utente di HTML.it
    Registrato dal
    Mar 2007
    Messaggi
    230
    Grazie ad entrambi

    @Vincenzo
    Non ricevo errore nè dal compilatore usato in DEV C++ che in un vecchio compilatore c.
    @LeXlex
    il modo con cui ho inizilalizzato "i" all'esterno dei for non è stavagante ma forse inconsueto.
    Cmq non è quello l'errore.

  5. #5
    Utente di HTML.it L'avatar di LexLex
    Registrato dal
    May 2008
    Messaggi
    56
    Originariamente inviato da puntino
    @LeXlex
    il modo con cui ho inizilalizzato "i" all'esterno dei for non è stavagante ma forse inconsueto.
    Cmq non è quello l'errore.
    ok! ho sbagliato a dire, non ha senso (statement with no effect)
    cmq, nel mio compilatore modificando quelle tre istruzioni la stampa è ordinata
    "Dai Diamanti non nasce niente, dal letame nascono i fiori.. " F.De Andrè

  6. #6
    Originariamente inviato da puntino
    Grazie ad entrambi

    @Vincenzo
    Non ricevo errore nè dal compilatore usato in DEV C++ che in un vecchio compilatore c.
    comunque l'errore è lì, sostituisci la dichiarazione del vettore con una costante e vedrai che ti funziona, sempre che utilizzi l'algoritmo suggerito da vincenzo perchè il tuo è sbagliato (per vedere dove basta che li confronti).
    @LeXlex
    il modo con cui ho inizilalizzato "i" all'esterno dei for non è stavagante ma forse inconsueto.
    Cmq non è quello l'errore.
    io ti consiglio di non utilizzare questo codice "inconsueto"
    ciao
    sergio

  7. #7
    Utente di HTML.it L'avatar di LexLex
    Registrato dal
    May 2008
    Messaggi
    56
    codice:
    for(i =1 ; i<nelem; i++) {
       for(j; j < nelem -i; j++) {
          if( array[j] > array[j+1]) {
             temp = array[j];
             array[j] = array[j+1];
             array[j+1] = temp;
          }
       }
    }
    L'errore è non inizializzare j a 0, nel primo ciclo dove i=1 va bene,
    perchè l'hai inizializzato in alto..
    dopo va riazzerato.

    Ciao.
    "Dai Diamanti non nasce niente, dal letame nascono i fiori.. " F.De Andrè

  8. #8
    Utente di HTML.it
    Registrato dal
    Mar 2007
    Messaggi
    230
    Grazie a tutti.
    Hai ragione, LexLex grazie.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.