Leçon 14 sur 20

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

Cours4 hComprendre les principes, invariants et propriétés des trois tris.
Travaux dirigés4 hTracer les passes, compter les opérations et corriger des algorithmes.
Travaux pratiques4 hImplémenter, tester et comparer les méthodes sur différents tableaux.
Travail personnel2 hPré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éesNotes croissantesLecture immédiate des faibles et fortes notes.
Noms dans l’ordre de saisieNoms alphabétiquesRecherche visuelle et édition d’une liste.
Produits mélangésProduits classés par prixComparaison commerciale plus facile.
Dates non ordonnéesDates chronologiquesConstruction 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

ÉtudiantMoyenneDécroissant
ProduitPrixCroissant
LivreTitreAlphabétique
ÉvénementDateChronologique
TâchePriorité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 croissantT[i] > T[j]
Tri décroissantT[i] < T[j]
Tri alphabétiqueNom1 vient après Nom2
Tri par moyenne décroissanteMoyenne[i] < Moyenne[j]

14.1.6 Propriétés utiles d’un algorithme de tri

Propriété

Signification

En placeLe tri utilise très peu de mémoire supplémentaire.
StableDeux éléments de même clé conservent leur ordre relatif initial.
AdaptatifLe tri profite d’un tableau déjà ou presque trié.
ComparatifL’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 129 ↔ 10[10, 29, 14, 37, 13]
i = 1[29, 14, 37, 13]13, indice 429 ↔ 13[10, 13, 14, 37, 29]
i = 2[14, 37, 29]14, indice 2Aucun[10, 13, 14, 37, 29]
i = 3[37, 29]29, indice 437 ↔ 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é favorableO(n²)
Complexité moyenneO(n²)
Complexité défavorableO(n²)
ÉchangesAu plus n - 1
Mémoire supplémentaireO(1)
Stable dans sa version simpleNon
AdaptatifNon
À 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]Oui8
2[1, 2, 4, 5, 8]Oui5, 8
3[1, 2, 4, 5, 8]NonArrê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é favorableO(n)
Complexité moyenneO(n²)
Complexité défavorableO(n²)
ÉchangesPotentiellement nombreux, jusqu’à O(n²)
Mémoire supplémentaireO(1)
StableOui, si on échange seulement pour > et non pour ≥
AdaptatifOui 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

111[12]12 vers la droite[11, 12, 13, 5, 6]
213[11, 12]Aucun[11, 12, 13, 5, 6]
35[11, 12, 13]13, 12 et 11[5, 11, 12, 13, 6]
46[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é favorableO(n)
Complexité moyenneO(n²)
Complexité défavorableO(n²)
DéplacementsFaibles sur un tableau presque trié
Mémoire supplémentaireO(1)
StableOui, avec la condition T[j] > cle
AdaptatifOui
À 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électionChoisir le plus petit restantMémoriser le bon indice.
BullesFaire remonter les grandes valeursGérer les bornes j et j + 1.
InsertionRanger une nouvelle cartePré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électionO(n²)O(n²)O(n²)
Bulles optimiséO(n)O(n²)O(n²)
InsertionO(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électionPeu d’échangesUtile si l’écriture est coûteuse.
BullesNombreux échanges voisinsCoût élevé sur un tableau inversé.
InsertionDécalages ciblésTrè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 croissanteAli(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

PrincipeChoisir le minimumÉchanger les voisinsInsérer la clé
Meilleur casO(n²)O(n)O(n)
Cas moyenO(n²)O(n²)O(n²)
Pire casO(n²)O(n²)O(n²)
MémoireO(1)O(1)O(1)
StableNon, version simpleOuiOui
AdaptatifNonOuiOui
MouvementsPeu d’échangesSouvent nombreuxDécalages
Usage conseilléPetit tableau, écritures coûteusesApprentissage, détection de triPetit ou presque trié

14.5.7 Choisir une méthode

Situation

Choix raisonnable

Justification

Très petit tableau pédagogiqueUne des troisSimplicité et lisibilité.
Tableau presque triéInsertionPeu de décalages.
Écritures très coûteusesSélectionNombre d’échanges limité.
Besoin de stabilitéInsertion ou bullesOrdre relatif des égalités conservé.
Très grand tableauTri 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 : 14Yassine : 16
Yassine : 16Sara : 14
Lina : 14Lina : 14
Adam : 11Adam : 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électionPasse inutile ou accès incorrect selon le codeS’arrêter à n - 2.
j atteint n - 1 dans les bulles puis accès à j + 1Dépassement du tableauLimiter j à fin - 1.
Écraser la clé pendant l’insertionPerte d’une valeurSauvegarder T[i] dans cle.
Oublier de remettre echange à FauxArrêt anticipé incorrectRéinitialiser à chaque passe.
Utiliser ≥ dans un tri stableInversion des égalitésComparer strictement >.
Déplacer la clé sans les données associéesInformations incohérentesDéplacer l’enregistrement complet.
Mauvaise condition pour le sens décroissantOrdre 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

03[3, 6, 12, 18, 10]
16[3, 6, 12, 18, 10]
210[3, 6, 10, 18, 12]
312[3, 6, 10, 12, 18]

Corrigé 2 — Nombre de comparaisons

Le nombre est n(n - 1) / 2.

n

Calcul

Comparaisons

55 × 4 / 210
1010 × 9 / 245
100100 × 99 / 24 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

59[5, 9, 1, 4, 3]
19, 5[1, 5, 9, 4, 3]
49, 5[1, 4, 5, 9, 3]
39, 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éInsertionPeu de décalages, meilleur cas linéaire.
Écritures coûteusesSélectionAu plus un échange par passe.
Besoin de stabilitéInsertion ou bullesVersions présentées stables.
Comparaisons voisinesBullesPrincipe 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

TriRéorganisation des mêmes éléments selon un ordre.
Clé de triInformation utilisée pour comparer deux éléments.
SélectionRecherche du minimum puis échange.
BullesComparaisons et échanges de voisins.
InsertionDé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é quadratiqueTemps proportionnel à n² dans les cas usuels ou défavorables.
Données associéesDoivent être déplacées ensemble.
ValidationVé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

TriRéorganisation d’une collection selon un ordre.
CléValeur servant de critère de comparaison.
PasseParcours partiel ou complet effectué par le tri.
ÉchangePermutation des contenus de deux cases.
DécalageDéplacement d’un élément vers une case voisine.
Partie triéeZone dont l’ordre est déjà garanti.
Partie non triéeZone restant à traiter.
StableQui conserve l’ordre relatif des clés égales.
En placeQui utilise une quantité constante de mémoire auxiliaire.
AdaptatifQui 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.