Aller au contenu principal

Module 04 · Leçon 2

Tri à bulles

180 minanalyse · pascal
Affichage du code

Ce que vous saurez faire

  • Décrire l'algorithme du tri à bulles
  • Implémenter le tri à bulles avec optimisation par drapeau
  • Comparer tri à bulles et tri par sélection

Avant de commencer

Le tri par sélection fait toujours le même nombre de comparaisons, qu'on lui donne un tableau aléatoire ou un tableau déjà trié. Peut-on faire mieux quand le tableau est presque trié ?


1. L'idée

À chaque passe, on parcourt le tableau et on échange les éléments adjacents dans le mauvais ordre. Les grandes valeurs "remontent" comme des bulles vers la fin.

On répète jusqu'à ce qu'aucun échange ne soit fait dans une passe → le tableau est trié.

T = [4, 2, 5, 1, 3]

Passe 1 :
[4,2,5,1,3] → 4>2 → échange → [2,4,5,1,3]
[2,4,5,1,3] → `4 < 5` → rien
[2,4,5,1,3] → 5>1 → échange → [2,4,1,5,3]
[2,4,1,5,3] → 5>3 → échange → [2,4,1,3,5]

Passe 2 :
... etc, jusqu'à une passe sans échange.

2. L'algorithme avec drapeau

DEF PROC Tri_Bulles(VAR T : Tab, n : entier)
  Répéter
    echange ← Faux
    Pour i de 1 à n-1 Faire
      Si T[i] > T[i+1] Alors
        Echanger(T[i], T[i+1])
        echange ← Vrai
      FinSi
    FinPour
  Jusqu'à echange = Faux
Fin Tri_Bulles

3. Complexité

CasComparaisons
Pire (tableau trié à l'envers)O(n²)
MoyenO(n²)
Meilleur (déjà trié)O(n) — une seule passe sans échange

C'est l'avantage du tri à bulles sur le tri par sélection : il détecte qu'un tableau est trié et s'arrête.


4. Variante : éviter de retester la fin déjà triée

Après la passe k, les k plus grands éléments sont garantis à leur place finale (en fin de tableau). On peut limiter la passe suivante :

PROCEDURE Tri_Bulles_Opt(VAR T : Tab; n : integer);
VAR
  i, fin : integer;
  echange : boolean;
BEGIN
  fin := n - 1;
  REPEAT
    echange := false;
    FOR i := 1 TO fin DO
      IF T[i] > T[i + 1] THEN
      BEGIN
        Echanger(T[i], T[i + 1]);
        echange := true;
      END;
    fin := fin - 1;
  UNTIL NOT echange;
END;

5. Exercices

Exercice 1facile
Une passe

Soit T = [5, 1, 4, 2, 8]. Donner l'état du tableau après une passe du tri à bulles.

Voir le corrigé

[5,1,4,2,8]5 > 1[1,5,4,2,8]5 > 4[1,4,5,2,8]5 > 2[1,4,2,5,8]5 < 8 rien.

Résultat : [1, 4, 2, 5, 8]. Le 8 et 5 sont maintenant à leur place.

Exercice 2moyen
Tri à bulles décroissant (type bac courant)

Adapter le tri à bulles pour trier en ordre décroissant. Donner le code en analyse et en Pascal.

Voir le corrigé

Inverser le test T[i] > T[i+1] en T[i] < T[i+1] :

PROCEDURE Tri_Bulles_Decroissant(VAR T : Tab; n : integer);
VAR
  i : integer;
  echange : boolean;
BEGIN
  REPEAT
    echange := false;
    FOR i := 1 TO n - 1 DO
      IF T[i] < T[i + 1] THEN     { < pour décroissant }
      BEGIN
        Echanger(T[i], T[i + 1]);
        echange := true;
      END;
  UNTIL NOT echange;
END;
Exercice 3difficile
Compter les passes (hors bac, bonus)

Modifier le tri pour qu'il retourne le nombre de passes effectuées (une passe = un tour complet du FOR).

Voir le corrigé
PROCEDURE Tri_Bulles_Compte(VAR T : Tab; n : integer; VAR nb_passes : integer);
VAR
  i : integer;
  echange : boolean;
BEGIN
  nb_passes := 0;
  REPEAT
    nb_passes := nb_passes + 1;
    echange := false;
    FOR i := 1 TO n - 1 DO
      IF T[i] > T[i + 1] THEN
      BEGIN
        Echanger(T[i], T[i + 1]);
        echange := true;
      END;
  UNTIL NOT echange;
END;

Sur un tableau déjà trié, nb_passes = 1. Sur un trié à l'envers, nb_passes ≈ n.


6. Erreurs fréquentes au bac

  • Oublier de réinitialiser echange à Faux au début de chaque passe.
  • Mettre Tant que echange = Vrai (Tant que) au lieu de Répéter…Jusqu'à → la première passe ne s'exécute jamais (puisque echange est Faux au début).
  • Comparer T[i] avec T[i] au lieu de T[i+1].

7. Quiz

Quiz (5 questions)

1

Le drapeau `echange` du tri à bulles sert à :

2

Sur un tableau déjà trié, le tri à bulles fait :

3

Après la passe k, les k plus grands éléments sont :

4

Quelle structure de boucle externe est la plus adaptée pour le tri à bulles ?

5

Différence principale avec le tri par sélection :

Bravo d'être arrivé jusqu'ici. Marquez la leçon terminée pour ancrer le progrès.