PDA

Visualizza la versione completa : [C] bubble sort


puntino
25-06-2008, 15:00
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



void bubblesort(int nelem, int array[]);

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

}



system("PAUSE");
return 0;
}


void bubblesort(int nelem, int array[])
{
int i;
int j = 0;
int temp;

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;
}
}
}

Vincenzo1968
25-06-2008, 16:32
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:



#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.

:)

LexLex
25-06-2008, 16:40
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" :nonlodire 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.

puntino
25-06-2008, 17:11
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.

LexLex
25-06-2008, 17:17
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 :)

mondobimbi
25-06-2008, 18:42
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

LexLex
25-06-2008, 18:43
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.

puntino
25-06-2008, 21:45
Grazie a tutti.
Hai ragione, LexLex grazie.

Loading