Problema bubble sort

di il
7 risposte

Problema bubble sort

Salve sono nuovo nel mondo della programmazione e sperimentando ho riscontrato questo problema ovvero quello che il mio codice non rispetta quello che mi aspetto.In poche parole il bubble sort non mi mette in ordine l'array di interi da me inseriti.Funziona solo quando ci sono di una sola posizione i numeri piu piccoli. Esempio inserisco 4 3 7 9 8 mi stampa a video in ordine crescente e decrescente nel modo giusto,mentre quando inserisco 99 7 56 33 22 mi stampa in modo crescente 7 56 33 22 99 e in decrescente 99 22 33 56 7


#include <stdio.h>
#include <stdlib.h>
#define n 5

int main()
{
int array[n];
int x=0;
int y=0;
int i=0;
int j=0;
int temp;
printf("inserire %d valori interi\n",n);
while(i<n)
{
	printf("%d di valore\n",i);
    scanf("%d",&array[i]);
	i++;
}
while(x<n-1)
{
	while(y<n-1)
	{
		if (array[y]>array[y+1])
		{
			temp=array[y];
			array[y]=array[y+1];
			array[y+1]=temp;
		}
		y++;
	}
x++;
}
printf("\nvettori crescenti\n");
while(j<n)
{
printf(" %4d ",array[j]);
j++;
}
int t;
t=n-1;
printf("\nvettori decrescenti\n");
while(t>=0)
{
printf(" %4d ",array[t]);
t--;
}

7 Risposte

  • Re: Problema bubble sort

    Usa i for, altrimenti ti dimentichi di inizializzare i cicli come hai fatto
  • Re: Problema bubble sort

    Weierstrass ha scritto:


    Usa i for, altrimenti ti dimentichi di inizializzare i cicli come hai fatto
    in che senso non ho inizializzato i cicli?
  • Re: Problema bubble sort

    Nell'unico senso possibile. Quanto vale y la seconda volta che entri nel secondo while annidato?
  • Re: Problema bubble sort

    Weierstrass ha scritto:


    Nell'unico senso possibile. Quanto vale y la seconda volta che entri nel secondo while annidato?
    credo che la y valga 1 perchè è stata dichiarata all'inizio del main
  • Re: Problema bubble sort

    La seconda volta che entri nel while, non la seconda iterazione del ciclo...
  • Re: Problema bubble sort

    Ovvero dopo

    x++;

    quanto vale y quando ricomincia il while interno?
  • Re: Problema bubble sort

    Aokiji
    Quello che stanno cercando di farti capire Weierstrass e oregon è che manca un dato formale fondamentale all'interno di questo ciclo
    while(x<n-1)
    {
    	while(y<n-1)
    	{
    		if (array[y]>array[y+1])
    		{
    			temp=array[y];
    			array[y]=array[y+1];
    			array[y+1]=temp;
    		}
    		y++;
    	}
    x++;
    }
    ovvero l'inizializzazione.
    Per inizializzazione si intende l'assegnazione di un valore ad una variabile, nel nostro caso ad un contatore.
    Il contatore è una variabile il cui incremento (o che più generalmente, "la cui modifica") permette di regolare, in seguito all'apposizione di una condizione di verifica, l'esecuzione di un ciclo. Ma attenzione, è una variabile come qualsiasi altra, e ciò comporta delle conseguenze. Analizziamo la porzione di codice qui sopra:

    1) correttamente dichiarate all'inizio del main, hai scelto come variabili contatore x e y;
    2) incontriamo il primo while: è x<n-1 ? x=0<n-1=4 ----> VERO, e dunque entriamo nel ciclo;
    3) incontriamo il secondo while: è y<n-1 ? y=0<n-1=4 ----> VERO, e dunque entriamo nel ciclo;
    4) la struttura dell'if è sintatticamente corretta. Non mi dilungo nell'analisi, ma sta di fatto che fa il suo dovere: confronta le due celle contigue del vettore e posiziona il valore più grande nella cella y+1;
    5) eseguito o meno l'if, si arriva a y++;, incrementiamo la y e si torna a verificare la condizione del while interno;
    6) è y<n-1 ? y=1<n-1=4 ----> VERO, e dunque si entra di nuovo nel ciclo;

    Senza soffermarci sul singolo passaggio, bypasso il processo e ti dico che la fine della prima esecuzione del while interno ordina il vettore così:
    "7, 56, 33, 22, 99"

    Fatto ciò si esce dal ciclo (in quanto y=4 e y<n-1 ----> FALSO) dunque incontriamo x++;, e si torna a verificare la condizione del primo while
    1) è x<n-1 ? x=1<n-1=4 ----> VERO, e si rientra nel ciclo;
    2) è y<n-1 ?

    ...e adesso che succede? beh, il programma verifica y<n-1, ma la y è sempre uguale a 4 ! nessuno le ha detto di ritornare a zero, per cui la condizione è falsa e non viene eseguito il ciclo interno!

    Difatti non verrà più eseguito per tutta la durata del ciclo esterno, e come output tornerà il vettore sopracitato, che scommetto ti risulti familiare.

    Il problema si può facilmente ovviare in questo modo:
    while(x<n-1)
    {
    	y=0;
    	while(y<n-1)
    	{
    		if (array[y]>array[y+1])
    		{
    			temp=array[y];
    			array[y]=array[y+1];
    			array[y+1]=temp;
    		}
    		y++;
    	}
    x++;
    }
    Il tutto risulta però facinoroso e ridondante, per cui in questi casi si preferisce utilizzare il ciclo for (come consigliato già da Weierstrass), la cui peculiarità è la possibilità di avere sott'occhio in una sola riga di codice l'inizializzazione del contatore, la condizione di verifica e l'incremento.

    Il ciclo apparirebbe così:
    for(x=0; x<n-1; x++){
    	for(y=0; y<n-1; y++){
    		if(array[y]>array[y+1]){
    			temp=array[y];
    			array[y]=array[y+1];
    			array[y+1]=temp;
    		}
    	}
    }


    P.s. usa meno variabili per i tuoi cicli/programmi, sono riutilizzabili.
    ne hai usate 6, ne bastavano 3
Devi accedere o registrarti per scrivere nel forum
7 risposte