Leçon 11 sur 19

Chapitre 11 — Comparaison approfondie des tris

Comprendre les compromis pour choisir une méthode adaptée aux données et aux contraintes

Idée directrice — Aucun algorithme de tri n’est meilleur dans toutes les situations. Le choix dépend de la taille des données, de leur ordre initial, de la mémoire disponible, de la stabilité recherchée et du coût réel des comparaisons et déplacements.

 

Vue d’ensemble des méthodes étudiées
Tris élémentaires : sélection, bulles, insertion
Tris efficaces    : fusion, rapide, tas
Critères          : temps, mémoire, stabilité, adaptativité
Décision          : taille, ordre initial, support de stockage, coût des opérations

 

Fiche pédagogique du chapitre

Objectifs d’apprentissage

À la fin de ce chapitre, l’étudiant devra être capable de :

  • expliquer le mécanisme fondamental des six tris étudiés ;
  • comparer leurs complexités temporelles dans différents cas ;
  • distinguer stabilité, adaptativité et caractère en place ;
  • évaluer la mémoire auxiliaire utilisée par une méthode ;
  • identifier les méthodes adaptées aux données presque triées ;
  • choisir un tri selon la taille et la nature des données ;
  • justifier le choix d’un tri pour un fichier volumineux ou une liste chaînée ;
  • réaliser un tri multicritère sans perdre l’ordre secondaire ;
  • concevoir une comparaison expérimentale équitable ;
  • proposer une stratégie de choix automatique d’un algorithme de tri.

Prérequis

  • Tableaux, listes et opérations d’échange ou de déplacement.
  • Complexités O(1), O(n), O(n log n) et O(n²).
  • Récursivité et paradigme « diviser pour régner ».
  • Tri par sélection, à bulles, par insertion, fusion, rapide et par tas.
  • Notions de mémoire auxiliaire et de pile des appels.

Organisation proposée

Partie

Contenu

Durée indicative

11.1Révision structurée des six tris2 h
11.2Stabilité, mémoire et adaptativité1 h 30
11.3Comparaison théorique et pratique1 h 30
11.4Choix selon la taille et le contexte1 h 30
ApplicationsFichiers, étudiants, mesures et sélection automatique1 h 30
TDAnalyse, décision et justification2 h
TPBenchmark reproductible des tris3 h

 

Positionnement dans le parcours — Le but du chapitre n’est pas de mémoriser un tableau de complexités, mais de construire une décision argumentée à partir des caractéristiques réelles du problème.

 


 

 

Introduction

Trier consiste à réorganiser une collection selon une relation d’ordre. Cette opération est omniprésente : classement d’étudiants, tri de produits par prix, organisation de fichiers, préparation d’une recherche dichotomique, regroupement de mesures ou production de rapports.

Plusieurs algorithmes peuvent produire exactement le même résultat tout en ayant des coûts très différents. Un petit tableau presque trié peut être traité efficacement par insertion, alors qu’un fichier de plusieurs gigaoctets exige une méthode de fusion externe. Un tri rapide est souvent excellent en mémoire vive, mais il n’est pas stable dans sa forme classique. Un tri par tas garantit O(n log n) et reste en place, mais ses accès mémoire sont moins favorables.

Question centrale — Comparer des tris signifie étudier simultanément le temps, la mémoire, la stabilité, l’ordre initial des données, le support de stockage et le coût des opérations sur les éléments.

 

11.1 Panorama des algorithmes de tri

Les six méthodes étudiées appartiennent à deux grandes familles. Les tris élémentaires effectuent généralement un nombre quadratique de comparaisons, mais restent simples et efficaces sur de petites collections. Les tris avancés offrent un coût asymptotique plus favorable, au prix d’une logique plus élaborée.

Algorithme

Idée principale

Famille

SélectionChoisir le minimum restant et le placerTri élémentaire
BullesÉchanger les voisins mal ordonnésTri élémentaire
InsertionInsérer chaque élément dans une partie déjà triéeTri élémentaire adaptatif
FusionDiviser, trier puis fusionnerDiviser pour régner
RapidePartitionner autour d’un pivotDiviser pour régner
TasExtraire successivement la racine d’un tasStructure de données

 

11.1.1 Tri par sélection

Le tri par sélection cherche, à chaque étape, le plus petit élément de la partie non triée et l’échange avec le premier élément de cette partie. Après la passe i, les i + 1 premières cases contiennent les plus petites valeurs dans l’ordre définitif.

PSEUDO-CODE — Tri par sélection
Procédure TriSelection(T, n)
    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
            Échanger(T[i], T[indiceMin])
        FinSi
    FinPour
FinProcédure
Remarque — Le nombre de comparaisons reste presque identique quel que soit l’ordre initial.

 

Critère

Analyse du tri par sélection

Comparaisonsn(n - 1) / 2, donc Θ(n²)
ÉchangesAu plus n - 1 : avantage lorsque les écritures sont coûteuses
MémoireO(1), tri en place
StabilitéNon stable dans sa version classique
AdaptativitéNon adaptatif
Cas recommandéPetites données et coût élevé des échanges

 

11.1.2 Tri à bulles

Le tri à bulles compare des éléments voisins et les échange lorsqu’ils sont dans le mauvais ordre. Après une passe complète de gauche à droite, le plus grand élément de la zone parcourue atteint sa position finale. Une variable booléenne permet d’arrêter l’algorithme lorsqu’aucun échange n’a eu lieu.

PSEUDO-CODE — Tri à bulles optimisé
Procédure TriBulles(T, n)
    borne ← n - 1
    Répéter
        échangeEffectué ← Faux
        dernièrePosition ← 0
        Pour i allant de 0 à borne - 1 Faire
            Si T[i] > T[i + 1] Alors
                Échanger(T[i], T[i + 1])
                échangeEffectué ← Vrai
                dernièrePosition ← i
            FinSi
        FinPour
        borne ← dernièrePosition
    Jusqu’à NON échangeEffectué
FinProcédure
Remarque — La dernière position d’échange réduit la zone à parcourir lors de la passe suivante.

 

Critère

Analyse du tri à bulles

Meilleur casO(n) avec arrêt anticipé sur un tableau déjà trié
Cas moyen / pireO(n²)
MémoireO(1), tri en place
StabilitéStable si seuls les éléments strictement mal ordonnés sont échangés
AdaptativitéOui avec l’optimisation
Cas recommandéDémonstration pédagogique ou très petites données presque triées

 

11.1.3 Tri par insertion

Le tri par insertion maintient une partie gauche déjà triée. L’élément courant est mémorisé, les éléments plus grands sont décalés vers la droite, puis l’élément est placé dans la case libérée. Le nombre de déplacements dépend directement du désordre initial.

PSEUDO-CODE — Tri par insertion
Procédure TriInsertion(T, n)
    Pour i allant de 1 à n - 1 Faire
        valeur ← T[i]
        j ← i - 1
        TantQue j ≥ 0 ET T[j] > valeur Faire
            T[j + 1] ← T[j]
            j ← j - 1
        FinTantQue
        T[j + 1] ← valeur
    FinPour
FinProcédure
Remarque — La comparaison stricte T[j] > valeur préserve l’ordre des éléments égaux et assure la stabilité.

 

Critère

Analyse du tri par insertion

Meilleur casO(n) si les données sont déjà triées
Cas moyen / pireO(n²)
MémoireO(1), tri en place
StabilitéStable
AdaptativitéTrès bonne : coût lié au nombre d’inversions
Cas recommandéPetites collections, données presque triées, sous-tableaux d’un tri hybride

 


 

 

11.1.4 Tri fusion

Le tri fusion divise récursivement la collection jusqu’à obtenir des sous-collections élémentaires, puis les fusionne dans l’ordre. Son coût O(n log n) est garanti, indépendamment de l’ordre initial. Sa stabilité et son accès séquentiel le rendent particulièrement adapté aux listes chaînées et aux fichiers externes.

PSEUDO-CODE — Tri fusion
Procédure TriFusion(T, gauche, droite)
    Si gauche < droite Alors
        milieu ← (gauche + droite) div 2
        TriFusion(T, gauche, milieu)
        TriFusion(T, milieu + 1, droite)
        Fusionner(T, gauche, milieu, droite)
    FinSi
FinProcédure

 

PSEUDO-CODE — Fusion de deux zones triées
Procédure Fusionner(T, gauche, milieu, droite)
    Copier T[gauche..milieu] dans G
    Copier T[milieu + 1..droite] dans D
    i ← 0 ; j ← 0 ; k ← gauche

    TantQue i < taille(G) ET j < taille(D) Faire
        Si G[i] ≤ D[j] Alors
            T[k] ← G[i] ; i ← i + 1
        Sinon
            T[k] ← D[j] ; j ← j + 1
        FinSi
        k ← k + 1
    FinTantQue

    Copier les éléments restants de G puis de D dans T
FinProcédure
Remarque — Le choix de G[i] en cas d’égalité garantit la stabilité.

 

Critère

Analyse du tri fusion

Tous les casΘ(n log n)
Mémoire sur tableauO(n) pour la zone auxiliaire
Mémoire sur listeO(log n) pour la récursion, fusion sans tableau auxiliaire
StabilitéStable si la fusion traite d’abord l’élément gauche en cas d’égalité
AdaptativitéFaible dans la version classique
Cas recommandéFichiers volumineux, listes chaînées, stabilité exigée

 

11.1.5 Tri rapide

Le tri rapide choisit un pivot, partitionne le tableau, puis trie récursivement les deux parties. Il est souvent très performant en pratique grâce à sa faible mémoire auxiliaire et à sa bonne localité de référence. Son pire cas quadratique doit être limité par un choix de pivot approprié.

PSEUDO-CODE — Tri rapide avec partition
Procédure TriRapide(T, gauche, droite)
    Si gauche < droite Alors
        p ← Partitionner(T, gauche, droite)
        TriRapide(T, gauche, p - 1)
        TriRapide(T, p + 1, droite)
    FinSi
FinProcédure

 

Critère

Analyse du tri rapide

Meilleur / moyenO(n log n)
Pire casO(n²) avec partitions très déséquilibrées
MémoireO(log n) en moyenne pour la pile récursive
StabilitéNon stable dans la version en place classique
AdaptativitéNon, et peut souffrir sur des données ordonnées avec un mauvais pivot
Cas recommandéTableaux en mémoire, performance pratique, mémoire limitée

 

11.1.6 Tri par tas

Le tri par tas construit un tas maximum, échange la racine avec le dernier élément de la zone active, réduit cette zone et restaure la propriété du tas. Il garantit O(n log n) et utilise une mémoire constante, mais n’est pas stable et effectue des accès moins séquentiels que le tri rapide.

PSEUDO-CODE — Tri par tas
Procédure TriTas(T, n)
    ConstruireTasMax(T, n)

    Pour fin allant de n - 1 à 1 pas -1 Faire
        Échanger(T[0], T[fin])
        DescendreMax(T, 0, fin)
    FinPour
FinProcédure
Remarque — Le paramètre fin représente la taille de la partie encore organisée en tas.

 

Critère

Analyse du tri par tas

Tous les casO(n log n)
Construction du tasO(n) par la méthode ascendante
MémoireO(1), tri en place
StabilitéNon stable
AdaptativitéNon adaptatif
Cas recommandéGarantie temporelle et mémoire auxiliaire très faible

 


 

 

11.2 Critères de comparaison

11.2.1 Complexité temporelle

La complexité asymptotique indique la croissance du coût lorsque la taille augmente. Elle ne remplace pas la mesure expérimentale : deux algorithmes de même ordre peuvent avoir des constantes, des accès mémoire et des comportements de cache très différents.

Tri

Meilleur cas

Cas moyen

Pire cas

SélectionΘ(n²)Θ(n²)Θ(n²)
Bulles optimiséO(n)O(n²)O(n²)
InsertionO(n)O(n²)O(n²)
FusionΘ(n log n)Θ(n log n)Θ(n log n)
RapideO(n log n)O(n log n)O(n²)
TasO(n log n)O(n log n)O(n log n)

 

Effet de la taille — Pour n = 100 000, un coût quadratique peut représenter environ dix milliards d’opérations élémentaires, alors qu’un coût n log n reste de l’ordre de quelques millions.

 

11.2.2 Stabilité

Un tri est stable lorsque deux éléments ayant la même clé conservent leur ordre relatif initial. Cette propriété est indispensable dans un tri multicritère réalisé en plusieurs étapes.

Exemple de stabilité
Données initiales classées par prénom :
(Amina, 14) ; (Hassan, 12) ; (Yasmine, 14)

Tri stable par note croissante :
(Hassan, 12) ; (Amina, 14) ; (Yasmine, 14)

Amina reste avant Yasmine parmi les notes égales.

 

Tri

Stable par défaut ?

Observation

SélectionNonL’échange lointain peut inverser des éléments égaux
BullesOuiÀ condition de ne pas échanger les égalités
InsertionOuiAvec une comparaison stricte lors du décalage
FusionOuiSi la partie gauche est choisie en cas d’égalité
RapideNonLes partitions déplacent les égalités
TasNonLes échanges racine-fin détruisent l’ordre relatif

 

11.2.3 Mémoire supplémentaire

La mémoire auxiliaire comprend les tableaux temporaires, les structures de travail et la pile des appels récursifs. Le caractère « en place » signifie généralement que la quantité de mémoire supplémentaire indépendante des données est constante ou logarithmique.

Tri

Mémoire auxiliaire

En place ?

SélectionO(1)Oui
BullesO(1)Oui
InsertionO(1)Oui
Fusion sur tableauO(n)Non
RapideO(log n) en moyenneOui, hors pile récursive
TasO(1)Oui

 

11.2.4 Nombre d’écritures et de déplacements

Dans certains systèmes, écrire une donnée coûte davantage que la comparer. C’est le cas de certaines mémoires non volatiles, de gros enregistrements ou de structures dont le déplacement déclenche des copies coûteuses.

  • Le tri par sélection réalise peu d’échanges, malgré ses nombreuses comparaisons.
  • Le tri à bulles peut réaliser un grand nombre d’échanges voisins.
  • Le tri par insertion effectue des décalages proportionnels au désordre.
  • Le tri fusion copie les données dans des zones temporaires.
  • Le tri rapide et le tri par tas réalisent des échanges en place.

11.3 Adaptation aux données presque triées

Une collection est presque triée lorsqu’elle contient peu d’inversions ou lorsque chaque élément est proche de sa position finale. Cette propriété peut être fréquente dans les mises à jour quotidiennes, les journaux temporels ou les tableaux ayant subi seulement quelques modifications.

11.3.1 Notion d’inversion

Une inversion est une paire d’indices i < j telle que T[i] > T[j]. Un tableau trié ne contient aucune inversion. Le coût du tri par insertion est étroitement lié au nombre d’inversions, car chaque déplacement en corrige une.

Exemple
T = [1, 2, 5, 4, 6, 7]
Une seule inversion significative : (5, 4)
Le tri par insertion déplace très peu d’éléments.

T = [7, 6, 5, 4, 3, 2, 1]
Nombre maximal d’inversions : n(n - 1) / 2

 

11.3.2 Comportement des méthodes

Tri

Comportement sur données presque triées

SélectionAucun bénéfice important : toutes les recherches de minimum sont effectuées
Bulles optimiséPeut s’arrêter rapidement si les inversions sont peu nombreuses
InsertionExcellent : proche de O(n) lorsque les déplacements sont rares
FusionReste O(n log n) sans optimisation spécifique
RapideDépend du pivot ; risque avec premier ou dernier élément
TasReste O(n log n), sans exploitation de l’ordre initial

 

Décision pratique — Pour une petite collection presque triée, le tri par insertion peut être plus rapide qu’un tri asymptotiquement optimal, car il possède peu de surcharge et exploite le faible nombre d’inversions.

 

11.4 Choix selon la taille et le contexte

11.4.1 Très petites collections

Pour quelques dizaines d’éléments, la simplicité, la faible surcharge et la localité mémoire dominent souvent l’analyse asymptotique. Le tri par insertion est généralement un excellent choix. De nombreuses bibliothèques utilisent d’ailleurs l’insertion pour les petits sous-tableaux produits par un tri avancé.

11.4.2 Collections de taille moyenne en mémoire

Le tri rapide est souvent privilégié pour des tableaux en mémoire lorsque la stabilité n’est pas requise. Le tri fusion convient lorsque la stabilité est essentielle. Le tri par tas fournit une garantie O(n log n) avec une mémoire auxiliaire constante.

11.4.3 Grandes collections et fichiers externes

Lorsqu’un fichier ne tient pas en mémoire, les accès disque dominent le coût. Le tri fusion externe est adapté parce qu’il lit et écrit de grands blocs séquentiels. Les morceaux du fichier sont triés en mémoire, écrits temporairement, puis fusionnés.

11.4.4 Listes chaînées

Le tri fusion est naturellement adapté aux listes chaînées : la division peut utiliser deux pointeurs et la fusion réorganise les références sans déplacer les données. L’accès aléatoire nécessaire à plusieurs autres tris est moins favorable.

11.4.5 Contraintes de temps réel ou de garantie

Lorsque le pire cas doit être maîtrisé, le tri par tas ou le tri fusion apporte une garantie O(n log n). Le tri rapide peut être sécurisé par une stratégie hybride telle que l’introsort, qui bascule vers le tri par tas si la récursion devient trop profonde.

Situation

Choix conseillé

Justification

n très petitInsertionFaible surcharge et bon cache
Presque triéInsertion ou bulles optimiséExploitation du faible désordre
Tableau moyen, mémoire limitéeRapideTrès bon comportement pratique
Stabilité obligatoireFusionConservation de l’ordre des égalités
Pire cas garanti + O(1) mémoireTasO(n log n) dans tous les cas
Fichier volumineuxFusion externeAccès séquentiels par blocs
Liste chaînéeFusionRéorganisation efficace des liens
Écritures coûteusesSélectionPeu d’échanges

 

11.4.6 Matrice de décision synthétique

Critère prioritaire

Méthodes favorables

Méthodes à éviter

StabilitéInsertion, bulles, fusionSélection, rapide, tas
Mémoire O(1)Sélection, bulles, insertion, tasFusion sur tableau
Performance moyenneRapide, fusion, tasSélection, bulles
Données presque triéesInsertion, bulles optimiséSélection, tas
Garantie O(n log n)Fusion, tasRapide classique
Fichier externeFusion externeRapide en place

 

11.5 Stratégie de choix automatique

Une bibliothèque peut sélectionner une méthode à partir de plusieurs indicateurs : taille de la collection, type de structure, estimation du désordre, besoin de stabilité, mémoire disponible et profondeur de récursion. Il s’agit d’un algorithme hybride plutôt que d’un tri unique.

PSEUDO-CODE — Choisir automatiquement une méthode de tri
Fonction ChoisirTri(données, stableRequis, mémoireLimitée) : Chaîne
    n ← taille(données)

    Si n ≤ 32 Alors
        Retourner "Insertion"
    FinSi

    Si EstPresqueTrié(données) Alors
        Retourner "Insertion"
    FinSi

    Si Type(données) = ListeChaînée Alors
        Retourner "Fusion"
    FinSi

    Si stableRequis Alors
        Retourner "Fusion"
    FinSi

    Si mémoireLimitée Alors
        Retourner "Tas"
    FinSi

    Retourner "RapideAléatoire"
FinFonction
Remarque — Les seuils doivent être mesurés sur l’environnement réel et non choisis arbitrairement.

 

PSEUDO-CODE — Estimation simple du désordre
Fonction EstPresqueTrié(T) : Booléen
    Si taille(T) < 2 Alors
        Retourner Vrai
    FinSi

    échantillons ← minimum(100, taille(T) - 1)
    ruptures ← 0

    Pour k allant de 1 à échantillons Faire
        i ← indice échantillonné entre 0 et taille(T) - 2
        Si T[i] > T[i + 1] Alors
            ruptures ← ruptures + 1
        FinSi
    FinPour

    Retourner ruptures ≤ échantillons / 20
FinFonction
Remarque — Cet estimateur mesure des ruptures locales ; il ne calcule pas exactement le nombre d’inversions.

 

Applications

Application 1 — Tri de fichiers volumineux

Un fichier de plusieurs gigaoctets ne tient pas entièrement en mémoire. Le tri externe suit deux phases : création de blocs triés puis fusion multi-voies. Chaque bloc est lu, trié en mémoire, écrit dans un fichier temporaire, puis tous les blocs sont fusionnés selon leur premier élément disponible.

PSEUDO-CODE — Tri fusion externe simplifié
Procédure TriExterne(fichierEntrée, capacitéMémoire)
    blocs ← ListeVide()

    TantQue fichierEntrée contient encore des données Faire
        bloc ← LireAuPlus(capacitéMémoire)
        TrierEnMémoire(bloc)
        chemin ← ÉcrireBlocTemporaire(bloc)
        Ajouter(blocs, chemin)
    FinTantQue

    FusionnerFichiersTriés(blocs, fichierSortie)
FinProcédure

 

Choix justifié — La performance dépend surtout du nombre de lectures et écritures séquentielles. Le tri fusion minimise les accès aléatoires au disque.

 

Application 2 — Tri multicritère d’étudiants

On souhaite classer les étudiants par moyenne décroissante, puis par nom croissant et enfin par numéro d’inscription. Deux approches sont possibles : utiliser directement un comparateur multicritère, ou appliquer plusieurs tris stables en commençant par le critère le moins prioritaire.

PSEUDO-CODE — Comparateur multicritère
Fonction Avant(e1, e2) : Booléen
    Si e1.moyenne ≠ e2.moyenne Alors
        Retourner e1.moyenne > e2.moyenne
    FinSi

    Si e1.nom ≠ e2.nom Alors
        Retourner e1.nom < e2.nom
    FinSi

    Retourner e1.numInscription < e2.numInscription
FinFonction

 

Rôle de la stabilité — Un tri stable permet aussi de trier d’abord par numéro, puis par nom, puis par moyenne. Le dernier tri correspond au critère le plus important.

 

Application 3 — Comparaison expérimentale des temps

Une comparaison équitable exige les mêmes données initiales pour tous les tris. Chaque algorithme doit recevoir une copie indépendante du tableau. Les mesures sont répétées, les premières exécutions peuvent être ignorées et plusieurs distributions sont testées.

Distribution

But du test

Aléatoire uniformeÉvaluer le comportement moyen
Déjà triéeMesurer l’adaptativité et les mauvais pivots
Ordre inverseCréer de nombreux déplacements et inversions
Peu de valeurs distinctesObserver la gestion des doublons
Presque triéeÉvaluer l’insertion et l’arrêt anticipé

 

PSEUDO-CODE — Protocole de mesure
Procédure ComparerTris(tableauInitial, listeTris, répétitions)
    Pour chaque tri dans listeTris Faire
        temps ← ListeVide()
        Pour r allant de 1 à répétitions Faire
            copie ← Copier(tableauInitial)
            début ← HorlogeHauteRésolution()
            tri(copie)
            fin ← HorlogeHauteRésolution()
             VérifierQueLeTableauEstTrié(copie)
            Ajouter(temps, fin - début)
        FinPour
        Afficher(tri.nom, Médiane(temps))
    FinPour
FinProcédure

 

Application 4 — Choix automatique d’une méthode

Un système hybride inspecte les caractéristiques du problème et choisit une méthode. Il peut également combiner plusieurs tris : tri rapide ou fusion pour les grandes zones, insertion pour les petites zones, et tas comme solution de secours en cas de récursion trop profonde.

Exemple de politique hybride
n ≤ 32                         → insertion
liste chaînée                    → fusion
stabilité requise                → fusion
mémoire très limitée             → tas
profondeur rapide trop grande    → tas
sinon                            → rapide avec pivot aléatoire

 

Erreurs fréquentes et points de vigilance

Erreur

Conséquence

Prévention

Comparer seulement le meilleur casChoix trop optimisteÉtudier le pire et le cas moyen
Confondre stable et en placeMauvaise propriété annoncéeDéfinir chaque critère séparément
Mesurer sur des tableaux différentsBenchmark non équitableCopier la même entrée
Tester une seule tailleConclusion non généralisableUtiliser plusieurs ordres de grandeur
Ignorer la distributionRésultat dépendant d’un seul scénarioTester aléatoire, trié, inverse et doublons
Mesurer sans vérifier le résultatAlgorithme rapide mais incorrectValider le tableau après chaque exécution
Utiliser un pivot fixe sur données triéesPire cas du tri rapidePivot aléatoire ou médiane de trois

 

Travaux dirigés

TD 1 — Compléter un tableau de propriétés

Compléter pour les six tris : meilleur cas, pire cas, stabilité, mémoire et adaptativité.

TD 2 — Choisir un tri pour chaque contexte

Proposer et justifier un choix pour : 20 valeurs presque triées, un million de valeurs en mémoire, une liste chaînée, un fichier de 50 Go et une application exigeant la stabilité.

TD 3 — Compter les opérations

Pour T = [5, 1, 4, 2, 3], compter les comparaisons et les échanges du tri par sélection et du tri à bulles.

TD 4 — Étudier la stabilité

À partir de [(A, 12), (B, 10), (C, 12), (D, 10)], montrer un résultat stable et un résultat non stable après tri sur la note.

TD 5 — Données presque triées

Comparer qualitativement insertion, fusion et tas sur T = [1, 2, 3, 4, 6, 5, 7, 8, 9].

TD 6 — Mémoire limitée

Une machine doit trier 10 millions d’entiers avec peu de mémoire libre. Comparer fusion, rapide et tas.

TD 7 — Tri multicritère

Écrire un comparateur permettant de classer par note décroissante, puis par nom croissant.

TD 8 — Construire une politique hybride

Proposer un arbre de décision utilisant la taille, la stabilité, le désordre et la mémoire.

TD 9 — Concevoir un benchmark

Définir les tailles, distributions, répétitions, métriques et contrôles nécessaires à une comparaison expérimentale.

TD 10 — Analyser des résultats

Un benchmark indique qu’insertion gagne pour n ≤ 40, rapide gagne sur tableaux aléatoires et fusion gagne sur gros fichiers. Expliquer ces observations.

Corrigés indicatifs des travaux dirigés

Correction du TD 1

Tri

Meilleur

Pire

Stable

Mémoire

Adaptatif

SélectionNonO(1)Non
Bulles opt.nOuiO(1)Oui
InsertionnOuiO(1)Oui
Fusionn log nn log nOuiO(n)Non classique
Rapiden log nNonO(log n) moy.Non
Tasn log nn log nNonO(1)Non

 

Correction du TD 2

Contexte

Choix possible

Justification

20 valeurs presque triéesInsertionTrès faible surcharge et peu de déplacements
1 000 000 de valeurs en mémoireRapide aléatoireBon comportement pratique et mémoire limitée
Liste chaînéeFusionDivision et fusion efficaces par pointeurs
Fichier de 50 GoFusion externeTravail par blocs et accès séquentiels
Stabilité obligatoireFusionGarantie de stabilité

 

Correction du TD 3

Pour le tri par sélection, le nombre de comparaisons vaut toujours 4 + 3 + 2 + 1 = 10. Le nombre d’échanges dépend de l’implémentation ; sur cette entrée, trois échanges suffisent. Le tri à bulles effectue des comparaisons voisines et plusieurs échanges ; avec une borne réduite et arrêt anticipé, le nombre exact dépend du dernier échange de chaque passe.

Trace résumée du tri par sélection
[5, 1, 4, 2, 3]
Minimum 1 → [1, 5, 4, 2, 3]
Minimum 2 → [1, 2, 4, 5, 3]
Minimum 3 → [1, 2, 3, 5, 4]
Minimum 4 → [1, 2, 3, 4, 5]

 

Correction du TD 4

Résultat stable : (B,10), (D,10), (A,12), (C,12). B reste avant D et A reste avant C. Un résultat tel que (D,10), (B,10), (C,12), (A,12) est trié sur la note mais non stable.

Correction du TD 5

  • Insertion parcourt presque linéairement et corrige seulement l’inversion (6,5).
  • Fusion effectue toujours sa division et ses fusions en Θ(n log n).
  • Tas reconstruit un tas et ne profite pas du faible désordre initial.

Correction du TD 6

Le tri fusion sur tableau demande une zone auxiliaire O(n), ce qui peut être problématique. Le tri rapide utilise une pile O(log n) en moyenne et est souvent le meilleur compromis. Le tri par tas garantit O(n log n) avec O(1) mémoire, au prix de constantes et d’accès mémoire moins favorables.

Correction du TD 7

PSEUDO-CODE — Comparateur note puis nom
Fonction Avant(e1, e2) : Booléen
    Si e1.note ≠ e2.note Alors
        Retourner e1.note > e2.note
    Sinon
        Retourner e1.nom < e2.nom
    FinSi
FinFonction

 

Correction du TD 8

Arbre de décision possible
Si n ≤ 32                      → insertion
Sinon si presque trié            → insertion
Sinon si liste chaînée           → fusion
Sinon si stabilité obligatoire   → fusion
Sinon si mémoire très limitée    → tas
Sinon                            → rapide aléatoire

 

Correction du TD 9

  • Tailles : par exemple 10², 10³, 10⁴, 10⁵ et 10⁶ selon les méthodes.
  • Distributions : aléatoire, triée, inverse, presque triée et nombreux doublons.
  • Répétitions : au moins 5 à 20 selon la variabilité.
  • Métriques : temps médian, comparaisons, échanges, mémoire et profondeur.
  • Contrôles : même entrée copiée, résultat vérifié, environnement identique.

Correction du TD 10

L’insertion gagne sur les petites tailles grâce à sa simplicité et à sa faible surcharge. Le tri rapide exploite bien le cache et évite une grande zone temporaire sur des tableaux aléatoires. Le tri fusion convient aux gros fichiers parce que ses accès sont séquentiels et que la fusion peut travailler par blocs.


 

 

Travail pratique — Comparateur expérimental de tris

Objectif

Implémenter et comparer les six tris sur plusieurs tailles et distributions. Le programme doit produire un rapport permettant de relier les mesures aux analyses théoriques.

Travail demandé

  1. Implémenter sélection, bulles optimisé, insertion, fusion, rapide et tas.
  2. Ajouter des compteurs de comparaisons, écritures ou échanges.
  3. Générer des tableaux aléatoires, triés, inversés, presque triés et riches en doublons.
  4. Exécuter plusieurs répétitions avec la même entrée copiée pour chaque méthode.
  5. Mesurer le temps avec une horloge de haute résolution.
  6. Vérifier automatiquement que chaque résultat est trié et contient les mêmes éléments.
  7. Produire un tableau récapitulatif et interpréter les résultats.
  8. Proposer une fonction de choix automatique fondée sur les observations.

Structure des mesures

Champ

Description

algorithmeNom de la méthode
tailleNombre d’éléments
distributionAléatoire, triée, inverse, presque triée ou doublons
tempsDurée en millisecondes
comparaisonsNombre de comparaisons de clés
écrituresAffectations dans la collection
mémoireEstimation de la mémoire auxiliaire
valideRésultat correctement trié

 

PSEUDO-CODE — Structure générale du benchmark
Procédure Benchmark(tailles, distributions, tris, répétitions)
    Pour chaque n dans tailles Faire
        Pour chaque distribution dans distributions Faire
            base ← GénérerDonnées(n, distribution)

            Pour chaque tri dans tris Faire
                mesures ← ListeVide()
                Pour r allant de 1 à répétitions Faire
                    copie ← Copier(base)
                    RéinitialiserCompteurs()
                    début ← HorlogeHauteRésolution()
                    tri(copie)
                    fin ← HorlogeHauteRésolution()
                    Vérifier(copie)
                    Ajouter(mesures, CréerMesure(fin - début, compteurs))
                FinPour
                Enregistrer(Médiane(mesures))
            FinPour
        FinPour
    FinPour
FinProcédure

 

Jeux d’essai minimaux

Cas

Entrée

But

Vide[]Vérifier la robustesse
Un élément[7]Cas élémentaire
Deux inversés[2,1]Échange minimal
Déjà trié[1,2,3,4,5]Adaptativité
Inverse[5,4,3,2,1]Cas défavorable de plusieurs tris
Doublons[3,1,3,2,1]Stabilité et égalités
Presque trié[1,2,4,3,5]Faible désordre

 

Grille d’évaluation proposée

Critère

Points

Correction des six tris6
Instrumentation des opérations3
Protocole expérimental équitable3
Diversité des jeux de données2
Validation automatique2
Analyse et interprétation3
Qualité du code et du rapport1

 


 

 

Synthèse du chapitre

Idée essentielle

À retenir

Tris élémentairesSimples et utiles sur petites tailles ; insertion est le plus polyvalent
Tri fusionStable, garanti en n log n, mais mémoire O(n) sur tableau
Tri rapideExcellent en pratique, en place, mais pire cas quadratique
Tri par tasGaranti en n log n et O(1) mémoire, mais non stable
StabilitéPréserve l’ordre relatif des égalités et facilite le multicritère
AdaptativitéInsertion et bulles optimisé exploitent le faible désordre
Fichiers externesLe tri fusion est privilégié pour ses accès séquentiels
Choix réelDépend des données, de la mémoire, des garanties et du support

 

Glossaire

Terme

Définition

AdaptatifAlgorithme dont le coût diminue lorsque les données sont déjà partiellement ordonnées.
En placeAlgorithme utilisant une faible mémoire supplémentaire indépendante de n.
InversionPaire i < j telle que T[i] > T[j].
StabilitéConservation de l’ordre relatif des éléments ayant la même clé.
Tri externeTri de données ne tenant pas entièrement en mémoire vive.
Tri hybrideCombinaison de plusieurs méthodes selon la taille ou l’état des données.
ComparateurFonction définissant l’ordre entre deux éléments.
BenchmarkProtocole de mesure reproductible destiné à comparer des performances.

 


 

 

Auto-évaluation

Je suis capable de…

Oui

À revoir

expliquer le principe des six tris
comparer leurs complexités temporelles
déterminer si un tri est stable et en place
choisir un tri pour des données presque triées
justifier le tri fusion pour un fichier volumineux
concevoir un comparateur multicritère
mettre en place un benchmark équitable
proposer une stratégie de tri hybride

 

Conclusion — Le meilleur tri n’est pas une réponse unique : c’est le résultat d’une analyse explicite des contraintes, des données et des garanties attendues.