Bonsoir,
Voilà un tri à bulle correct avec les 2 optimisations possibles :
1) A chaque itération de la boucle while(1) on s'arrête une valeur plus tôt (--max;) car chaque passage déplace le plus grand élément à la fin.
2) Si aucun échange n'a été réalisé au cours d'une itération de la boucle while(1) alors le tri est terminé et on peut quitter (variable fin).
J'ai aussi simplifier et corrigé le main() (le ; derrière le for de la boucle de visualisation !).
#include <stdio.h>
// ============
// Tri à bulles
// ============
void Trier(int tab[],int size)
{
int i,j,max,swap,fin;
max = size - 1;
while (1)
{
fin = 1;
for (i=0,j=1 ; i<max ; ++i,++j)
{
if (tab[i] > tab[j])
{
// --- Permuter les 2 valeurs i et j
swap = tab[i];
tab[i] = tab[j];
tab[j] = swap;
fin = 0;
}
}
if (fin == 1) return; // tri terminé
--max; // la dernière valeur est à sa place
}
}
// ===================
// Fonction principale
// ===================
int main(void)
{
int tab[50];
int size;
int i;
// --- Saisir la taille du tableau
printf("Choisir le nombre de valeur du tableau : ");
scanf("%d",&size);
if (size > 50) size = 50;
// --- Saisir les valeurs du tableau
for(i=0 ; i<size ; ++i)
{
printf("Rentrer la valeur %d : ",i + 1);
scanf("%d",&tab[i]);
}
// --- Voir le contenu du tableau
printf("\nTableau saisi : \n");
for(i=0 ; i<size ; ++i)
printf("- %d \n",tab[i]);
// --- Trier le tableau
Trier(tab,size);
// --- Voir le contenu du tableau
printf("\nTableau trie : \n");
for(i=0 ; i<size ; ++i)
printf("- %d \n",tab[i]);
return 0;
}
Ce qui donne :
Choisir le nombre de valeur du tableau : 7
Rentrer la valeur 1 : 123
Rentrer la valeur 2 : 213
Rentrer la valeur 3 : 321
Rentrer la valeur 4 : 567
Rentrer la valeur 5 : 900
Rentrer la valeur 6 : 99
Rentrer la valeur 7 : 1001
Tableau saisi :
- 123
- 213
- 321
- 567
- 900
- 99
- 1001
Tableau trie :
- 99
- 123
- 213
- 321
- 567
- 900
- 1001
Jean-François