Tri à bulles - Problème

Les Galériennes de l'Info -  
Bonjour à tous, :)
On doit faire un programme de tri à bulles. Le programme n'a pas d'erreur mais le résultat n'est pas bon et nous ne savons pas pourquoi. Le programme a été écrit sur Visual Studio en C++. Pouvez-vous nous aider ? Merci d'avance :)

#include <stdio.h>
#define MAX 100
void tri_bulle(float tabi[MAX], int nb) {
int fin_tri;
float nb_swap=0;
int i=0;
do {
fin_tri = 1;
for (i = 0; i < (nb+1) ; i++) {
if (tabi[i] > tabi[i + 1]) {
nb_swap = tabi[i];
tabi[i] = tabi[i + 1];
tabi[i + 1] = nb_swap;
fin_tri = 0;
}
}
} while (fin_tri == 0);
 
}
void main(void) {
float tabi[MAX];
int nb;
int i=0;
do {
printf("Combien de prix, entre 0 et 100, voulez-vous rentrer dans le tableau ?");
scanf("%d", &nb);
} while (nb < 0 || nb>100);
for (i = 0; i < nb; i++) {
printf("Rentrez le %d prix :\n", i + 1);
scanf("%f", &tabi[i]);
} 
tri_bulle(tabi,nb);
printf("Le tableau trié par ordre croissant est donc \n");
for (i = 0; i < nb; i++) {
printf(" %f | ", tabi[i]);
}
}

2 réponses

  1. Salut,

    Tu n as que la moitié dans ton code: tu regarde n par rapport à n+1, mais après il est ignoré (quand n=n+1, le check se limite entre n+1 et n+2 => pas de check sur le n initial).

    tu pourrai rajouter, par exemple:



    if (tabi[i] > tabi[i + 1]) {
    for(j=i+1;j>0 ; j++)
    {
    if( tab[j]<tab[j-1) {
    nb_swap = tabi[j];
    tabi[j] = tabi[j - 1];
    tabi[j - 1] = nb_swap;

    }
    }
    }



    si qui ordonnera le tout (je me rapel plus des codes exactes qui definissent les tri mais bref). C est juste un exempe que j ai tappé vite fait, donc a checker, mais ca te donnera une bonne idée de pourquoi ton code est insuffisant.

    naga

    EDIT: ah et tu auras un soucis avec
    i < (nb+1) 
    dans le for de la fonction, mais je te laisse découvrir ^^(comme piste : penses au dernier indice du tableau et des indices utilisés pour les tests)
    1. Bonjour et merci pour ta réponse,
      si je comprends bien le programme ne lit qu'une seule fois le tableau c'est ça ?

      Et pour la boucle for, on a mis nb+1 car quand on compare la valeur nb il va y avoir un problème si on a pas de valeur au rang nb+1....
    2. Salut,
      En l occurrance tu fais un passage qui fait "remonter" le plus grand mais c est tout, le reste est oublié.

      pour le "+1", je dis pas juste que la manière dont tu as codé tu vas aller lire dans de la mémoire non alloué (ou qui n a rien a voir), car si tu as n éléments, le dernier indice est n-1
    3. ok merci beaucoup pour ton aide !! :)
  2. Bonjour,

    seule erreur dans la boucle for qui va plus qu'un peu trop loin dans ses indices.
    1. Pour la boucle for, on a mis nb+1 car quand on compare la valeur i= nb il va y avoir un problème si on a pas de valeur au rang nb+1....
    2. @Les Galériennes de l'Infoet quand on prend l'indice i + 1, il doit être aussi inférieur à n, d'où le test i + 1 < n au lieu de i < n + 1 !!
    3. ah oui !!! Merci beaucoup !!!!! :)