Chapitre 14 — Algorithmes de tri
Organiser, classer et préparer efficacement les données
Fiche pédagogique du chapitre
Objectifs d’apprentissage
À la fin de ce chapitre, l’étudiant devra être capable de :
- expliquer l’intérêt d’ordonner des données avant leur exploitation ;
- définir un critère et un sens de tri ;
- distinguer une partie triée d’une partie non triée ;
- concevoir et tracer un tri par sélection ;
- concevoir et optimiser un tri à bulles ;
- concevoir un tri par insertion ;
- effectuer correctement les comparaisons, échanges et décalages ;
- trier dans l’ordre croissant ou décroissant ;
- trier des nombres, des chaînes et des enregistrements ;
- préserver l’association entre plusieurs informations ;
- comparer les tris selon leur simplicité, leur coût et le contexte ;
- analyser leur comportement sur un tableau déjà ou presque trié ;
- construire des jeux d’essai et détecter les erreurs classiques.
Prérequis
- maîtriser les variables, conditions et boucles imbriquées ;
- savoir déclarer, parcourir et modifier un tableau ;
- connaître les fonctions et procédures ;
- savoir utiliser une variable temporaire pour échanger deux valeurs ;
- comprendre les comparaisons numériques et lexicographiques ;
- savoir construire une table de trace.
Plan du chapitre
14.1 Intérêt du tri
14.2 Tri par sélection
14.3 Tri à bulles
14.4 Tri par insertion
14.5 Comparaison des tris
Applications, travaux dirigés, corrigés et synthèse
Organisation pédagogique indicative
Activité | Durée indicative | Objectif principal |
|---|---|---|
| Cours | 4 h | Comprendre les principes, invariants et propriétés des trois tris. |
| Travaux dirigés | 4 h | Tracer les passes, compter les opérations et corriger des algorithmes. |
| Travaux pratiques | 4 h | Implémenter, tester et comparer les méthodes sur différents tableaux. |
| Travail personnel | 2 h | Préparer des jeux d’essai et analyser les résultats. |
| Idée centrale : un tri ne change pas les données présentes : il les réorganise selon un critère défini tout en conservant chaque information et, si nécessaire, ses associations. |
Introduction aux algorithmes de tri
Trier consiste à réorganiser une collection de valeurs selon un ordre. Cet ordre peut être croissant, décroissant, alphabétique, chronologique ou défini par un critère propre à l’application, comme la moyenne d’un étudiant ou le prix d’un produit.
Dans un tableau trié en ordre croissant, chaque élément est inférieur ou égal à l’élément suivant. En ordre décroissant, chaque élément est supérieur ou égal au suivant. Le tri doit conserver toutes les valeurs, y compris les doublons.
Données initiales | Critère | Résultat trié |
|---|---|---|
| [14, 8, 19, 8, 11] | Ordre croissant | [8, 8, 11, 14, 19] |
| [14, 8, 19, 8, 11] | Ordre décroissant | [19, 14, 11, 8, 8] |
| ["Sara", "Adam", "Yasmine"] | Ordre alphabétique | ["Adam", "Sara", "Yasmine"] |
| [12/05, 03/02, 21/01] | Ordre chronologique | [21/01, 03/02, 12/05] |
| Contrat d’un tri : le tableau final doit être ordonné selon le critère choisi et contenir exactement les mêmes éléments que le tableau initial. |
14.1 Intérêt du tri
14.1.1 Organisation des données
Le tri donne une structure lisible à un ensemble de données. Il facilite la consultation, la détection des valeurs extrêmes, le repérage des doublons et la production de rapports ordonnés.
Avant le tri | Après le tri | Avantage |
|---|---|---|
| Notes dispersées | Notes croissantes | Lecture immédiate des faibles et fortes notes. |
| Noms dans l’ordre de saisie | Noms alphabétiques | Recherche visuelle et édition d’une liste. |
| Produits mélangés | Produits classés par prix | Comparaison commerciale plus facile. |
| Dates non ordonnées | Dates chronologiques | Construction d’un historique cohérent. |
14.1.2 Accélération de la recherche
Un tableau trié permet d’utiliser la recherche dichotomique. Cette méthode élimine une moitié de la zone possible à chaque comparaison. Le tri peut donc être rentable lorsque les mêmes données sont recherchées de nombreuses fois.
Pour une seule recherche dans un petit tableau non trié, trier d’abord peut être inutile. En revanche, pour des milliers de recherches dans une liste stable, le coût initial du tri peut être largement amorti.
| Attention : le tri n’accélère pas automatiquement toutes les opérations. Il faut considérer le coût global : préparation, tri, recherches et mises à jour ultérieures. |
14.1.3 Classement
Le classement ordonne des objets selon un critère. Une compétition peut classer les participants par score décroissant. Une classe peut être ordonnée par moyenne. Une boutique peut afficher les produits du moins cher au plus cher.
Objet | Critère de tri | Sens fréquent |
|---|---|---|
| Étudiant | Moyenne | Décroissant |
| Produit | Prix | Croissant |
| Livre | Titre | Alphabétique |
| Événement | Date | Chronologique |
| Tâche | Priorité | Décroissant |
14.1.4 Préparation à d’autres traitements
De nombreux traitements deviennent plus simples après un tri : recherche dichotomique, fusion de listes, suppression des doublons contigus, calcul d’une médiane, regroupement de valeurs identiques ou affichage paginé.
- calcul de la médiane à partir de valeurs ordonnées ;
- regroupement des occurrences d’une même valeur ;
- comparaison de deux listes triées ;
- fusion de deux tableaux déjà triés ;
- détection rapide des doublons adjacents ;
- présentation cohérente dans une interface ou un rapport.
14.1.5 Critère, clé et sens du tri
La clé de tri est l’information utilisée pour comparer deux éléments. Pour des nombres, la clé est souvent la valeur elle-même. Pour un étudiant, elle peut être la moyenne, le nom ou le numéro d’inscription.
Le sens précise si la clé doit évoluer de la plus petite vers la plus grande ou l’inverse. La comparaison utilisée par l’algorithme doit être cohérente avec ce sens.
Objectif | Condition signalant un mauvais ordre |
|---|---|
| Tri croissant | T[i] > T[j] |
| Tri décroissant | T[i] < T[j] |
| Tri alphabétique | Nom1 vient après Nom2 |
| Tri par moyenne décroissante | Moyenne[i] < Moyenne[j] |
14.1.6 Propriétés utiles d’un algorithme de tri
Propriété | Signification |
|---|---|
| En place | Le tri utilise très peu de mémoire supplémentaire. |
| Stable | Deux éléments de même clé conservent leur ordre relatif initial. |
| Adaptatif | Le tri profite d’un tableau déjà ou presque trié. |
| Comparatif | L’ordre est déterminé à l’aide de comparaisons entre clés. |
| Complexité | Nombre d’opérations en fonction de la taille n. |
Les tris étudiés dans ce chapitre sont simples et comparatifs. Ils sont particulièrement utiles pour comprendre les mécanismes fondamentaux, même si des méthodes plus rapides sont préférées pour de très grands volumes.
14.2 Tri par sélection
14.2.1 Principe général
Le tri par sélection construit progressivement une partie triée au début du tableau. À chaque passe, il recherche le minimum de la partie non triée puis l’échange avec le premier élément de cette partie.
Zone | Rôle |
|---|---|
| T[0..i-1] | Partie déjà triée et définitive. |
| T[i..n-1] | Partie non triée dans laquelle chercher le minimum. |
| T[i] | Position qui recevra le prochain minimum. |
| Invariant : au début de chaque passe i, les i premières cases contiennent les i plus petites valeurs dans l’ordre croissant. |
14.2.2 Recherche du minimum
La recherche commence à l’indice i. Une variable indiceMin mémorise la position de la plus petite valeur rencontrée. Chaque élément suivant est comparé au minimum courant.
Recherche du minimum dans une zone
| indiceMin ← i Pour j allant de i + 1 à n - 1 Faire Si T[j] < T[indiceMin] Alors indiceMin ← j FinSi FinPour |
Il est essentiel de mémoriser l’indice et non seulement la valeur, car l’échange doit connaître la case à déplacer.
14.2.3 Échange
Après la recherche, l’élément minimal est placé à la position i. L’ancienne valeur T[i] est déplacée à l’emplacement du minimum grâce à une variable temporaire.
Échange de deux cases
| temp ← T[i] T[i] ← T[indiceMin] T[indiceMin] ← temp |
| Optimisation simple : si indiceMin = i, la valeur correcte est déjà en place et l’échange peut être évité. |
14.2.4 Algorithme complet en ordre croissant
Tri par sélection
| Procédure TriSelection(T : Tableau, n : Entier) Variables i, j, indiceMin : Entier temp : Réel Début Pour i allant de 0 à n - 2 Faire indiceMin ← i Pour j allant de i + 1 à n - 1 Faire Si T[j] < T[indiceMin] Alors indiceMin ← j FinSi FinPour Si indiceMin ≠ i Alors temp ← T[i] T[i] ← T[indiceMin] T[indiceMin] ← temp FinSi FinPour Fin |
La dernière case n’a pas besoin d’une passe propre : lorsque les n - 1 premières valeurs sont correctement placées, la valeur restante est nécessairement la plus grande.
14.2.5 Trace détaillée
Considérons le tableau T = [29, 10, 14, 37, 13].
Passe | Partie examinée | Minimum trouvé | Échange | Tableau après la passe |
|---|---|---|---|---|
| i = 0 | [29, 10, 14, 37, 13] | 10, indice 1 | 29 ↔ 10 | [10, 29, 14, 37, 13] |
| i = 1 | [29, 14, 37, 13] | 13, indice 4 | 29 ↔ 13 | [10, 13, 14, 37, 29] |
| i = 2 | [14, 37, 29] | 14, indice 2 | Aucun | [10, 13, 14, 37, 29] |
| i = 3 | [37, 29] | 29, indice 4 | 37 ↔ 29 | [10, 13, 14, 29, 37] |
14.2.6 Version décroissante
Pour trier dans l’ordre décroissant, il suffit de rechercher le maximum de la partie non triée. La structure générale ne change pas.
Modification essentielle
| Si T[j] > T[indiceMax] Alors indiceMax ← j FinSi |
14.2.7 Nombre d’opérations et propriétés
Le nombre de comparaisons ne dépend pas de l’ordre initial. La première passe effectue n - 1 comparaisons, la suivante n - 2, puis n - 3, jusqu’à 1.
Le total vaut n(n - 1) / 2, ce qui correspond à une complexité temporelle quadratique O(n²). Le nombre d’échanges est au plus n - 1, ce qui peut être avantageux lorsque les écritures sont coûteuses.
Propriété | Tri par sélection |
|---|---|
| Complexité favorable | O(n²) |
| Complexité moyenne | O(n²) |
| Complexité défavorable | O(n²) |
| Échanges | Au plus n - 1 |
| Mémoire supplémentaire | O(1) |
| Stable dans sa version simple | Non |
| Adaptatif | Non |
| À retenir : le tri par sélection est simple et limite les échanges, mais il effectue pratiquement le même travail même si le tableau est déjà trié. |
14.3 Tri à bulles
14.3.1 Principe général
Le tri à bulles compare des éléments voisins. Si deux voisins sont dans le mauvais ordre, ils sont échangés. Après une passe complète de gauche à droite, la plus grande valeur de la zone active atteint sa position définitive à droite.
Le nom évoque une bulle qui remonte progressivement : les grandes valeurs se déplacent vers la fin par échanges successifs.
Comparaison | Action en ordre croissant |
|---|---|
| T[j] ≤ T[j + 1] | Conserver l’ordre. |
| T[j] > T[j + 1] | Échanger les deux voisins. |
14.3.2 Échanges successifs
Considérons T = [5, 1, 4, 2, 8]. Pendant la première passe, les comparaisons successives déplacent la valeur 8 vers la dernière case.
Comparaison | Résultat |
|---|---|
| 5 et 1 : échange | [1, 5, 4, 2, 8] |
| 5 et 4 : échange | [1, 4, 5, 2, 8] |
| 5 et 2 : échange | [1, 4, 2, 5, 8] |
| 5 et 8 : aucun échange | [1, 4, 2, 5, 8] |
| Invariant : après la passe numéro p, les p plus grandes valeurs occupent leurs positions définitives à la fin du tableau. |
14.3.3 Version simple
Tri à bulles non optimisé
| Procédure TriBulles(T : Tableau, n : Entier) Variables i, j : Entier temp : Réel Début Pour i allant de 0 à n - 2 Faire Pour j allant de 0 à n - 2 - i Faire Si T[j] > T[j + 1] Alors temp ← T[j] T[j] ← T[j + 1] T[j + 1] ← temp FinSi FinPour FinPour Fin |
La borne n - 2 - i évite de revisiter les dernières cases déjà fixées. L’indice j + 1 reste ainsi au maximum égal à n - 1.
14.3.4 Optimisation par détection d’absence d’échange
Si une passe ne réalise aucun échange, tous les couples voisins sont déjà dans le bon ordre. Le tableau est donc trié et les passes restantes sont inutiles.
Tri à bulles optimisé
| Procédure TriBullesOptimise(T : Tableau, n : Entier) Variables fin, j : Entier echange : Booléen temp : Réel Début fin ← n - 1 Répéter echange ← Faux Pour j allant de 0 à fin - 1 Faire Si T[j] > T[j + 1] Alors temp ← T[j] T[j] ← T[j + 1] T[j + 1] ← temp echange ← Vrai FinSi FinPour fin ← fin - 1 Jusqu’à echange = Faux OU fin = 0 Fin |
| Initialisation indispensable : la variable echange doit être remise à Faux au début de chaque passe. Sinon, l’algorithme peut effectuer des passes inutiles ou ne jamais détecter la fin du tri. |
14.3.5 Trace des passes
Pour T = [5, 1, 4, 2, 8], la version optimisée produit :
Passe | Tableau obtenu | Échange réalisé ? | Zone fixée |
|---|---|---|---|
| 1 | [1, 4, 2, 5, 8] | Oui | 8 |
| 2 | [1, 2, 4, 5, 8] | Oui | 5, 8 |
| 3 | [1, 2, 4, 5, 8] | Non | Arrêt anticipé |
14.3.6 Variante décroissante
Pour obtenir un ordre décroissant, l’échange est déclenché lorsque l’élément gauche est plus petit que l’élément droit.
| Si T[j] < T[j + 1] Alors Échanger(T[j], T[j + 1]) FinSi |
14.3.7 Nombre d’opérations et propriétés
Sans optimisation, le tri à bulles effectue un nombre quadratique de comparaisons. Avec l’arrêt anticipé, son meilleur cas devient linéaire lorsque le tableau est déjà trié.
Propriété | Tri à bulles optimisé |
|---|---|
| Complexité favorable | O(n) |
| Complexité moyenne | O(n²) |
| Complexité défavorable | O(n²) |
| Échanges | Potentiellement nombreux, jusqu’à O(n²) |
| Mémoire supplémentaire | O(1) |
| Stable | Oui, si on échange seulement pour > et non pour ≥ |
| Adaptatif | Oui avec détection d’absence d’échange |
| À retenir : le tri à bulles est pédagogique et peut reconnaître un tableau déjà trié, mais ses nombreux échanges le rendent peu adapté aux grands volumes. |
14.4 Tri par insertion
14.4.1 Partie triée et partie non triée
Le tri par insertion construit une partie triée à gauche. Il considère d’abord que le premier élément est trié. Puis il prend chaque nouvel élément, appelé clé, et l’insère à la bonne position dans la partie déjà ordonnée.
Zone | Rôle |
|---|---|
| T[0..i-1] | Partie triée avant l’insertion. |
| T[i] | Clé à insérer. |
| T[i+1..n-1] | Partie pas encore traitée. |
Cette méthode ressemble à la manière de ranger des cartes dans une main : chaque nouvelle carte est déplacée vers la gauche jusqu’à sa position correcte.
14.4.2 Décalage des éléments
Contrairement à la sélection et aux bulles, l’insertion ne procède pas principalement par échanges. Les valeurs plus grandes que la clé sont décalées d’une case vers la droite, puis la clé est écrite dans la case libérée.
Mécanisme d’insertion
| cle ← T[i] j ← i - 1 TantQue j ≥ 0 ET T[j] > cle Faire T[j + 1] ← T[j] j ← j - 1 FinTantQue T[j + 1] ← cle |
| Pourquoi j + 1 ?la boucle s’arrête soit à j = -1, soit devant une valeur inférieure ou égale à la clé. La bonne position se trouve donc immédiatement après j. |
14.4.3 Algorithme complet
Tri par insertion croissant
| Procédure TriInsertion(T : Tableau, n : Entier) Variables i, j : Entier cle : Réel Début Pour i allant de 1 à n - 1 Faire cle ← T[i] j ← i - 1 TantQue j ≥ 0 ET T[j] > cle Faire T[j + 1] ← T[j] j ← j - 1 FinTantQue T[j + 1] ← cle FinPour Fin |
14.4.4 Trace détaillée
Considérons T = [12, 11, 13, 5, 6].
i | Clé | Partie triée avant | Décalages | Tableau après insertion |
|---|---|---|---|---|
| 1 | 11 | [12] | 12 vers la droite | [11, 12, 13, 5, 6] |
| 2 | 13 | [11, 12] | Aucun | [11, 12, 13, 5, 6] |
| 3 | 5 | [11, 12, 13] | 13, 12 et 11 | [5, 11, 12, 13, 6] |
| 4 | 6 | [5, 11, 12, 13] | 13, 12 et 11 | [5, 6, 11, 12, 13] |
14.4.5 Cas presque trié
Le tri par insertion est particulièrement efficace lorsque peu d’éléments sont mal placés. Si chaque clé est déjà supérieure ou égale à l’élément précédent, aucune valeur n’est décalée et chaque passe coûte très peu.
Tableau | Observation |
|---|---|
| [1, 2, 3, 4, 5] | Aucun décalage : cas favorable. |
| [1, 2, 4, 3, 5] | Un petit déplacement suffit. |
| [5, 4, 3, 2, 1] | Chaque clé traverse toute la partie triée : cas défavorable. |
14.4.6 Version décroissante
Pour un ordre décroissant, les valeurs plus petites que la clé doivent être décalées vers la droite.
| TantQue j ≥ 0 ET T[j] < cle Faire T[j + 1] ← T[j] j ← j - 1 FinTantQue |
14.4.7 Nombre d’opérations et propriétés
Propriété | Tri par insertion |
|---|---|
| Complexité favorable | O(n) |
| Complexité moyenne | O(n²) |
| Complexité défavorable | O(n²) |
| Déplacements | Faibles sur un tableau presque trié |
| Mémoire supplémentaire | O(1) |
| Stable | Oui, avec la condition T[j] > cle |
| Adaptatif | Oui |
| À retenir : le tri par insertion est simple, stable et très performant sur de petites collections ou des données presque triées. |
14.5 Comparaison des tris
14.5.1 Simplicité
Les trois algorithmes utilisent des structures élémentaires. La sélection repose sur la recherche d’un minimum, les bulles sur des comparaisons voisines et l’insertion sur l’ouverture d’une place dans une partie triée.
Méthode | Image mentale | Point délicat |
|---|---|---|
| Sélection | Choisir le plus petit restant | Mémoriser le bon indice. |
| Bulles | Faire remonter les grandes valeurs | Gérer les bornes j et j + 1. |
| Insertion | Ranger une nouvelle carte | Préserver la clé pendant les décalages. |
14.5.2 Nombre de comparaisons
La sélection réalise toujours environ n²/2 comparaisons. Les bulles et l’insertion peuvent en réaliser beaucoup moins lorsque le tableau est déjà ou presque trié, à condition d’utiliser la version optimisée du tri à bulles.
Méthode | Déjà trié | Ordre aléatoire | Ordre inverse |
|---|---|---|---|
| Sélection | O(n²) | O(n²) | O(n²) |
| Bulles optimisé | O(n) | O(n²) | O(n²) |
| Insertion | O(n) | O(n²) | O(n²) |
14.5.3 Nombre d’échanges ou de déplacements
Le tri par sélection limite les échanges à un par passe. Le tri à bulles peut effectuer un échange pour chaque inversion, donc beaucoup d’écritures. Le tri par insertion effectue des décalages et est souvent avantageux lorsque les éléments sont proches de leur position finale.
Méthode | Mouvements de données | Conséquence |
|---|---|---|
| Sélection | Peu d’échanges | Utile si l’écriture est coûteuse. |
| Bulles | Nombreux échanges voisins | Coût élevé sur un tableau inversé. |
| Insertion | Décalages ciblés | Très bon sur un tableau presque trié. |
14.5.4 Stabilité
Un tri stable conserve l’ordre initial de deux éléments ayant la même clé. Cette propriété est importante lorsqu’un premier classement a déjà été effectué selon un autre critère.
Avant tri par note | Clé | Après tri stable |
|---|---|---|
| Ali(14), Sara(16), Lina(14) | Note croissante | Ali(14), Lina(14), Sara(16) |
Ali reste avant Lina parce que les deux notes sont égales et qu’Ali apparaissait d’abord. L’insertion et les bulles sont stables dans leurs versions présentées. La sélection simple ne l’est généralement pas, car un échange éloigné peut inverser deux éléments de même clé.
14.5.5 Comportement sur un tableau presque trié
Le tri par insertion est généralement le meilleur des trois dans ce contexte. Le tri à bulles optimisé peut aussi terminer rapidement si une passe ne détecte aucun échange. Le tri par sélection ne profite pas de l’ordre existant, car il cherche systématiquement le minimum restant.
14.5.6 Tableau comparatif global
Critère | Sélection | Bulles optimisé | Insertion |
|---|---|---|---|
| Principe | Choisir le minimum | Échanger les voisins | Insérer la clé |
| Meilleur cas | O(n²) | O(n) | O(n) |
| Cas moyen | O(n²) | O(n²) | O(n²) |
| Pire cas | O(n²) | O(n²) | O(n²) |
| Mémoire | O(1) | O(1) | O(1) |
| Stable | Non, version simple | Oui | Oui |
| Adaptatif | Non | Oui | Oui |
| Mouvements | Peu d’échanges | Souvent nombreux | Décalages |
| Usage conseillé | Petit tableau, écritures coûteuses | Apprentissage, détection de tri | Petit ou presque trié |
14.5.7 Choisir une méthode
Situation | Choix raisonnable | Justification |
|---|---|---|
| Très petit tableau pédagogique | Une des trois | Simplicité et lisibilité. |
| Tableau presque trié | Insertion | Peu de décalages. |
| Écritures très coûteuses | Sélection | Nombre d’échanges limité. |
| Besoin de stabilité | Insertion ou bulles | Ordre relatif des égalités conservé. |
| Très grand tableau | Tri plus avancé | Les trois méthodes restent quadratiques en moyenne. |
| Limite commune : pour de très grands tableaux, des algorithmes comme le tri fusion, le tri rapide ou les fonctions de tri des langages sont généralement préférables. |
Applications guidées
Application 1 — Trier des notes
On souhaite trier les notes d’une classe dans l’ordre croissant afin de faciliter le calcul de la médiane et l’analyse de la distribution.
Solution avec tri par insertion
| Algorithme TrierNotes Variables Notes : Tableau de Réels n, i, j : Entiers cle : Réel Début Lire(n) Pour i allant de 0 à n - 1 Faire Répéter Lire(Notes[i]) Jusqu’à Notes[i] ≥ 0 ET Notes[i] ≤ 20 FinPour Pour i allant de 1 à n - 1 Faire cle ← Notes[i] j ← i - 1 TantQue j ≥ 0 ET Notes[j] > cle Faire Notes[j + 1] ← Notes[j] j ← j - 1 FinTantQue Notes[j + 1] ← cle FinPour Pour i allant de 0 à n - 1 Faire Afficher(Notes[i]) FinPour Fin |
Notes initiales | Notes triées |
|---|---|
| [14, 8.5, 17, 10, 8.5] | [8.5, 8.5, 10, 14, 17] |
Application 2 — Classer des étudiants
Chaque étudiant possède un nom et une moyenne. Le classement doit être décroissant selon la moyenne. En cas d’égalité, l’ordre initial est conservé grâce à un tri stable.
Tri par insertion sur des enregistrements
| Pour i allant de 1 à n - 1 Faire etudiantCle ← Etudiants[i] j ← i - 1 TantQue j ≥ 0 ET Etudiants[j].moyenne < etudiantCle.moyenne Faire Etudiants[j + 1] ← Etudiants[j] j ← j - 1 FinTantQue Etudiants[j + 1] ← etudiantCle FinPour |
Avant | Après classement |
|---|---|
| Sara : 14 | Yassine : 16 |
| Yassine : 16 | Sara : 14 |
| Lina : 14 | Lina : 14 |
| Adam : 11 | Adam : 11 |
| Stabilité : Sara reste avant Lina parmi les moyennes égales à 14, car le tri n’échange pas deux clés égales. |
Application 3 — Trier des noms
Les chaînes sont comparées selon l’ordre lexicographique. Pour éviter que les majuscules et minuscules produisent un ordre inattendu, on peut comparer des versions normalisées tout en conservant les noms originaux.
Comparaison normalisée
| Si Minuscules(Noms[j]) < Minuscules(Noms[indiceMin]) Alors indiceMin ← j FinSi |
Noms initiaux | Ordre alphabétique |
|---|---|
| ["yasmine", "Adam", "sara", "Lina"] | ["Adam", "Lina", "sara", "yasmine"] |
Application 4 — Trier dans l’ordre croissant ou décroissant
Une procédure peut recevoir un paramètre sens. La condition de mauvais ordre est alors calculée selon la valeur de ce paramètre.
Tri à bulles paramétrable
| Procédure Trier(T : Tableau, n : Entier, sens : Caractère) Variables fin, j : Entiers mauvaisOrdre, echange : Booléens Début fin ← n - 1 Répéter echange ← Faux Pour j allant de 0 à fin - 1 Faire mauvaisOrdre ← (sens = 'C' ET T[j] > T[j + 1]) OU (sens = 'D' ET T[j] < T[j + 1]) Si mauvaisOrdre Alors Échanger(T[j], T[j + 1]) echange ← Vrai FinSi FinPour fin ← fin - 1 Jusqu’à echange = Faux OU fin = 0 Fin |
Entrée | Sens | Résultat |
|---|---|---|
| [7, 2, 9, 4] | C | [2, 4, 7, 9] |
| [7, 2, 9, 4] | D | [9, 7, 4, 2] |
Application 5 — Trier plusieurs informations associées
Supposons que les noms et les notes soient stockés dans deux tableaux parallèles. Chaque déplacement d’une note doit être reproduit sur le nom correspondant. Sinon, les informations seront désynchronisées.
Sélection avec tableaux parallèles
| Pour i allant de 0 à n - 2 Faire indiceMax ← i Pour j allant de i + 1 à n - 1 Faire Si Notes[j] > Notes[indiceMax] Alors indiceMax ← j FinSi FinPour Si indiceMax ≠ i Alors Échanger(Notes[i], Notes[indiceMax]) Échanger(Noms[i], Noms[indiceMax]) FinSi FinPour |
Avant | Après tri décroissant des notes |
|---|---|
| Noms : [Ali, Sara, Adam] | Noms : [Sara, Ali, Adam] |
| Notes : [13, 17, 10] | Notes : [17, 13, 10] |
| Bonne pratique : l’utilisation d’un tableau d’enregistrements est généralement plus sûre que plusieurs tableaux parallèles, car toutes les informations d’un objet sont déplacées ensemble. |
Erreurs fréquentes et stratégie de test
Erreurs fréquentes
Erreur | Conséquence | Correction |
|---|---|---|
| Boucle externe jusqu’à n - 1 inclus en sélection | Passe inutile ou accès incorrect selon le code | S’arrêter à n - 2. |
| j atteint n - 1 dans les bulles puis accès à j + 1 | Dépassement du tableau | Limiter j à fin - 1. |
| Écraser la clé pendant l’insertion | Perte d’une valeur | Sauvegarder T[i] dans cle. |
| Oublier de remettre echange à Faux | Arrêt anticipé incorrect | Réinitialiser à chaque passe. |
| Utiliser ≥ dans un tri stable | Inversion des égalités | Comparer strictement >. |
| Déplacer la clé sans les données associées | Informations incohérentes | Déplacer l’enregistrement complet. |
| Mauvaise condition pour le sens décroissant | Ordre opposé | Inverser le comparateur. |
Jeux d’essai recommandés
Cas | Exemple | But du test |
|---|---|---|
| Tableau vide | [] | Vérifier l’absence d’accès. |
| Un seul élément | [5] | Vérifier les bornes des boucles. |
| Déjà trié | [1, 2, 3, 4] | Observer le meilleur cas adaptatif. |
| Ordre inverse | [4, 3, 2, 1] | Tester le pire cas. |
| Doublons | [3, 1, 3, 2, 1] | Conserver toutes les valeurs et tester la stabilité. |
| Valeurs négatives | [2, -5, 0, -1] | Vérifier le comparateur. |
| Toutes égales | [7, 7, 7] | Éviter les échanges inutiles. |
Vérification du résultat
Un test complet vérifie deux propriétés : l’ordre et la conservation des données. Vérifier seulement que le tableau est croissant ne suffit pas si une valeur a été perdue ou dupliquée par erreur.
Vérifier l’ordre croissant
| Fonction EstTrieCroissant(T : Tableau, n : Entier) : Booléen Variables i : Entier Début Pour i allant de 0 à n - 2 Faire Si T[i] > T[i + 1] Alors Retourner Faux FinSi FinPour Retourner Vrai Fin |
Pour vérifier la conservation, on peut comparer les effectifs de chaque valeur avant et après le tri ou conserver une copie de référence et utiliser un second tri fiable dans un environnement de test.
Travaux dirigés
Exercice 1 — Tracer un tri par sélection
Appliquer le tri par sélection croissant au tableau [18, 6, 12, 3, 10]. Indiquer le minimum, l’échange et le tableau après chaque passe.
Exercice 2 — Compter les comparaisons
Donner le nombre de comparaisons réalisées par le tri par sélection pour n = 5, n = 10 et n = 100.
Exercice 3 — Tracer un tri à bulles
Appliquer le tri à bulles optimisé au tableau [4, 2, 5, 1, 3]. Montrer le tableau après chaque passe et préciser quand l’algorithme s’arrête.
Exercice 4 — Corriger les bornes
L’algorithme suivant contient une erreur :
| Pour i allant de 0 à n - 1 Faire Pour j allant de 0 à n - 1 - i Faire Si T[j] > T[j + 1] Alors Échanger(T[j], T[j + 1]) FinSi FinPour FinPour |
Identifier l’accès invalide et proposer les bornes correctes.
Exercice 5 — Tracer un tri par insertion
Trier [9, 5, 1, 4, 3] par insertion. Pour chaque clé, indiquer les éléments décalés et la position d’insertion.
Exercice 6 — Version décroissante
Adapter le tri par insertion afin d’ordonner les valeurs du plus grand au plus petit.
Exercice 7 — Trier des noms
Écrire une procédure qui trie un tableau de noms dans l’ordre alphabétique sans modifier la casse des chaînes originales.
Exercice 8 — Classement multi-critères
Classer des étudiants par moyenne décroissante. En cas d’égalité, les classer par nom croissant.
Exercice 9 — Préserver les associations
Deux tableaux contiennent des références de produits et leurs prix. Écrire un tri croissant par prix qui conserve la correspondance entre chaque référence et son prix.
Exercice 10 — Choisir le tri
Choisir parmi sélection, bulles optimisé et insertion pour les situations suivantes : tableau presque trié, écritures très coûteuses, besoin de stabilité, apprentissage des comparaisons voisines. Justifier.
Exercice 11 — Tester la stabilité
On dispose de [A(12), B(15), C(12), D(15)]. Donner le résultat attendu d’un tri stable par note croissante et expliquer comment détecter une perte de stabilité.
Exercice 12 — Vérifier un tri
Écrire une fonction EstTrie(T, n, sens) qui vérifie un ordre croissant ou décroissant selon le paramètre sens.
Corrigés indicatifs des travaux dirigés
Corrigé 1 — Tri par sélection
Passe | Minimum | Tableau |
|---|---|---|
| 0 | 3 | [3, 6, 12, 18, 10] |
| 1 | 6 | [3, 6, 12, 18, 10] |
| 2 | 10 | [3, 6, 10, 18, 12] |
| 3 | 12 | [3, 6, 10, 12, 18] |
Corrigé 2 — Nombre de comparaisons
Le nombre est n(n - 1) / 2.
n | Calcul | Comparaisons |
|---|---|---|
| 5 | 5 × 4 / 2 | 10 |
| 10 | 10 × 9 / 2 | 45 |
| 100 | 100 × 99 / 2 | 4 950 |
Corrigé 3 — Tri à bulles
Passe | Tableau | Échange ? |
|---|---|---|
| 1 | [2, 4, 1, 3, 5] | Oui |
| 2 | [2, 1, 3, 4, 5] | Oui |
| 3 | [1, 2, 3, 4, 5] | Oui |
| 4 | [1, 2, 3, 4, 5] | Non, arrêt |
Corrigé 4 — Bornes correctes
Lorsque j = n - 1 - i, l’accès T[j + 1] peut dépasser la zone valide à la première passe. La boucle interne doit s’arrêter à n - 2 - i et la boucle externe à n - 2.
| Pour i allant de 0 à n - 2 Faire Pour j allant de 0 à n - 2 - i Faire Si T[j] > T[j + 1] Alors Échanger(T[j], T[j + 1]) FinSi FinPour FinPour |
Corrigé 5 — Tri par insertion
Clé | Décalages | Tableau |
|---|---|---|
| 5 | 9 | [5, 9, 1, 4, 3] |
| 1 | 9, 5 | [1, 5, 9, 4, 3] |
| 4 | 9, 5 | [1, 4, 5, 9, 3] |
| 3 | 9, 5, 4 | [1, 3, 4, 5, 9] |
Corrigé 6 — Insertion décroissante
| Pour i allant de 1 à n - 1 Faire cle ← T[i] j ← i - 1 TantQue j ≥ 0 ET T[j] < cle Faire T[j + 1] ← T[j] j ← j - 1 FinTantQue T[j + 1] ← cle FinPour |
Corrigé 7 — Trier des noms
| Pour i allant de 1 à n - 1 Faire nomCle ← Noms[i] cleComparee ← Minuscules(nomCle) j ← i - 1 TantQue j ≥ 0 ET Minuscules(Noms[j]) > cleComparee Faire Noms[j + 1] ← Noms[j] j ← j - 1 FinTantQue Noms[j + 1] ← nomCle FinPour |
Corrigé 8 — Classement multi-critères
Un étudiant A doit passer avant B si sa moyenne est plus grande, ou si les moyennes sont égales et son nom vient avant celui de B.
Condition de déplacement en insertion
| TantQue j ≥ 0 ET (Etudiants[j].moyenne < cle.moyenne OU (Etudiants[j].moyenne = cle.moyenne ET Etudiants[j].nom > cle.nom)) Faire Etudiants[j + 1] ← Etudiants[j] j ← j - 1 FinTantQue |
Corrigé 9 — Références et prix
À chaque échange de prix, les références correspondantes doivent également être échangées.
| Échanger(Prix[i], Prix[indiceMin]) Échanger(References[i], References[indiceMin]) |
Une meilleure modélisation consiste à créer un enregistrement Produit contenant la référence et le prix.
Corrigé 10 — Choix du tri
Situation | Choix | Justification |
|---|---|---|
| Presque trié | Insertion | Peu de décalages, meilleur cas linéaire. |
| Écritures coûteuses | Sélection | Au plus un échange par passe. |
| Besoin de stabilité | Insertion ou bulles | Versions présentées stables. |
| Comparaisons voisines | Bulles | Principe directement basé sur les voisins. |
Corrigé 11 — Stabilité
Le résultat stable est A(12), C(12), B(15), D(15). A reste avant C et B reste avant D. Une inversion de ces couples signale que le tri n’a pas conservé l’ordre relatif des égalités.
Corrigé 12 — Vérifier un tri
| Fonction EstTrie(T : Tableau, n : Entier, sens : Caractère) : Booléen Variables i : Entier Début Pour i allant de 0 à n - 2 Faire Si sens = 'C' ET T[i] > T[i + 1] Alors Retourner Faux FinSi Si sens = 'D' ET T[i] < T[i + 1] Alors Retourner Faux FinSi FinPour Retourner Vrai Fin |
Synthèse du chapitre
Le tri organise les données selon une clé et un sens. Le tri par sélection place successivement les minima et limite le nombre d’échanges. Le tri à bulles compare les voisins et peut s’arrêter lorsqu’une passe ne réalise aucun échange. Le tri par insertion place chaque nouvelle clé dans une partie déjà triée et se montre particulièrement efficace sur de petits tableaux presque ordonnés.
Notion | À retenir |
|---|---|
| Tri | Réorganisation des mêmes éléments selon un ordre. |
| Clé de tri | Information utilisée pour comparer deux éléments. |
| Sélection | Recherche du minimum puis échange. |
| Bulles | Comparaisons et échanges de voisins. |
| Insertion | Décalages puis insertion d’une clé. |
| Stabilité | Conservation de l’ordre relatif des clés égales. |
| Adaptativité | Capacité à profiter d’un ordre déjà présent. |
| Complexité quadratique | Temps proportionnel à n² dans les cas usuels ou défavorables. |
| Données associées | Doivent être déplacées ensemble. |
| Validation | Vérifier l’ordre et la conservation des valeurs. |
Checklist de conception
1. Définir la clé et le sens du tri.
2. Choisir une méthode compatible avec la taille et l’état des données.
3. Fixer correctement les bornes des boucles.
4. Préserver la valeur temporaire avant tout écrasement.
5. Déplacer ensemble les informations associées.
6. Décider si la stabilité est nécessaire.
7. Prévoir les tableaux vides, unitaires et contenant des doublons.
8. Tester les cas déjà trié et inversé.
9. Vérifier l’ordre du résultat.
10. Vérifier que toutes les données ont été conservées.
Glossaire
Terme | Définition |
|---|---|
| Tri | Réorganisation d’une collection selon un ordre. |
| Clé | Valeur servant de critère de comparaison. |
| Passe | Parcours partiel ou complet effectué par le tri. |
| Échange | Permutation des contenus de deux cases. |
| Décalage | Déplacement d’un élément vers une case voisine. |
| Partie triée | Zone dont l’ordre est déjà garanti. |
| Partie non triée | Zone restant à traiter. |
| Stable | Qui conserve l’ordre relatif des clés égales. |
| En place | Qui utilise une quantité constante de mémoire auxiliaire. |
| Adaptatif | Qui profite de l’ordre déjà présent. |
Auto-évaluation
Compétence | Acquise | À renforcer |
|---|---|---|
| Je sais expliquer l’intérêt du tri. | □ | □ |
| Je sais tracer un tri par sélection. | □ | □ |
| Je sais écrire un tri à bulles optimisé. | □ | □ |
| Je sais tracer un tri par insertion. | □ | □ |
| Je sais trier en ordre croissant ou décroissant. | □ | □ |
| Je sais comparer les trois méthodes. | □ | □ |
| Je sais préserver les informations associées. | □ | □ |
| Je sais construire des jeux d’essai pertinents. | □ | □ |
| Conclusion : choisir un tri consiste à équilibrer simplicité, coût des comparaisons, mouvements de données, stabilité et organisation initiale du tableau. |