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.1 | Révision structurée des six tris | 2 h |
| 11.2 | Stabilité, mémoire et adaptativité | 1 h 30 |
| 11.3 | Comparaison théorique et pratique | 1 h 30 |
| 11.4 | Choix selon la taille et le contexte | 1 h 30 |
| Applications | Fichiers, étudiants, mesures et sélection automatique | 1 h 30 |
| TD | Analyse, décision et justification | 2 h |
| TP | Benchmark reproductible des tris | 3 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élection | Choisir le minimum restant et le placer | Tri élémentaire |
| Bulles | Échanger les voisins mal ordonnés | Tri élémentaire |
| Insertion | Insérer chaque élément dans une partie déjà triée | Tri élémentaire adaptatif |
| Fusion | Diviser, trier puis fusionner | Diviser pour régner |
| Rapide | Partitionner autour d’un pivot | Diviser pour régner |
| Tas | Extraire successivement la racine d’un tas | Structure 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 |
|---|---|
| Comparaisons | n(n - 1) / 2, donc Θ(n²) |
| Échanges | Au plus n - 1 : avantage lorsque les écritures sont coûteuses |
| Mémoire | O(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 cas | O(n) avec arrêt anticipé sur un tableau déjà trié |
| Cas moyen / pire | O(n²) |
| Mémoire | O(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 cas | O(n) si les données sont déjà triées |
| Cas moyen / pire | O(n²) |
| Mémoire | O(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 tableau | O(n) pour la zone auxiliaire |
| Mémoire sur liste | O(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 / moyen | O(n log n) |
| Pire cas | O(n²) avec partitions très déséquilibrées |
| Mémoire | O(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 cas | O(n log n) |
| Construction du tas | O(n) par la méthode ascendante |
| Mémoire | O(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²) |
| Insertion | O(n) | O(n²) | O(n²) |
| Fusion | Θ(n log n) | Θ(n log n) | Θ(n log n) |
| Rapide | O(n log n) | O(n log n) | O(n²) |
| Tas | O(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élection | Non | L’échange lointain peut inverser des éléments égaux |
| Bulles | Oui | À condition de ne pas échanger les égalités |
| Insertion | Oui | Avec une comparaison stricte lors du décalage |
| Fusion | Oui | Si la partie gauche est choisie en cas d’égalité |
| Rapide | Non | Les partitions déplacent les égalités |
| Tas | Non | Les é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élection | O(1) | Oui |
| Bulles | O(1) | Oui |
| Insertion | O(1) | Oui |
| Fusion sur tableau | O(n) | Non |
| Rapide | O(log n) en moyenne | Oui, hors pile récursive |
| Tas | O(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élection | Aucun 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 |
| Insertion | Excellent : proche de O(n) lorsque les déplacements sont rares |
| Fusion | Reste O(n log n) sans optimisation spécifique |
| Rapide | Dépend du pivot ; risque avec premier ou dernier élément |
| Tas | Reste 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 petit | Insertion | Faible surcharge et bon cache |
| Presque trié | Insertion ou bulles optimisé | Exploitation du faible désordre |
| Tableau moyen, mémoire limitée | Rapide | Très bon comportement pratique |
| Stabilité obligatoire | Fusion | Conservation de l’ordre des égalités |
| Pire cas garanti + O(1) mémoire | Tas | O(n log n) dans tous les cas |
| Fichier volumineux | Fusion externe | Accès séquentiels par blocs |
| Liste chaînée | Fusion | Réorganisation efficace des liens |
| Écritures coûteuses | Sélection | Peu d’échanges |
11.4.6 Matrice de décision synthétique
Critère prioritaire | Méthodes favorables | Méthodes à éviter |
|---|---|---|
| Stabilité | Insertion, bulles, fusion | Sélection, rapide, tas |
| Mémoire O(1) | Sélection, bulles, insertion, tas | Fusion sur tableau |
| Performance moyenne | Rapide, fusion, tas | Sélection, bulles |
| Données presque triées | Insertion, bulles optimisé | Sélection, tas |
| Garantie O(n log n) | Fusion, tas | Rapide classique |
| Fichier externe | Fusion externe | Rapide 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ée | Mesurer l’adaptativité et les mauvais pivots |
| Ordre inverse | Créer de nombreux déplacements et inversions |
| Peu de valeurs distinctes | Observer 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 cas | Choix trop optimiste | Étudier le pire et le cas moyen |
| Confondre stable et en place | Mauvaise propriété annoncée | Définir chaque critère séparément |
| Mesurer sur des tableaux différents | Benchmark non équitable | Copier la même entrée |
| Tester une seule taille | Conclusion non généralisable | Utiliser plusieurs ordres de grandeur |
| Ignorer la distribution | Résultat dépendant d’un seul scénario | Tester aléatoire, trié, inverse et doublons |
| Mesurer sans vérifier le résultat | Algorithme rapide mais incorrect | Valider le tableau après chaque exécution |
| Utiliser un pivot fixe sur données triées | Pire cas du tri rapide | Pivot 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élection | n² | n² | Non | O(1) | Non |
| Bulles opt. | n | n² | Oui | O(1) | Oui |
| Insertion | n | n² | Oui | O(1) | Oui |
| Fusion | n log n | n log n | Oui | O(n) | Non classique |
| Rapide | n log n | n² | Non | O(log n) moy. | Non |
| Tas | n log n | n log n | Non | O(1) | Non |
Correction du TD 2
Contexte | Choix possible | Justification |
|---|---|---|
| 20 valeurs presque triées | Insertion | Très faible surcharge et peu de déplacements |
| 1 000 000 de valeurs en mémoire | Rapide aléatoire | Bon comportement pratique et mémoire limitée |
| Liste chaînée | Fusion | Division et fusion efficaces par pointeurs |
| Fichier de 50 Go | Fusion externe | Travail par blocs et accès séquentiels |
| Stabilité obligatoire | Fusion | Garantie 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é
- Implémenter sélection, bulles optimisé, insertion, fusion, rapide et tas.
- Ajouter des compteurs de comparaisons, écritures ou échanges.
- Générer des tableaux aléatoires, triés, inversés, presque triés et riches en doublons.
- Exécuter plusieurs répétitions avec la même entrée copiée pour chaque méthode.
- Mesurer le temps avec une horloge de haute résolution.
- Vérifier automatiquement que chaque résultat est trié et contient les mêmes éléments.
- Produire un tableau récapitulatif et interpréter les résultats.
- Proposer une fonction de choix automatique fondée sur les observations.
Structure des mesures
Champ | Description |
|---|---|
| algorithme | Nom de la méthode |
| taille | Nombre d’éléments |
| distribution | Aléatoire, triée, inverse, presque triée ou doublons |
| temps | Durée en millisecondes |
| comparaisons | Nombre de comparaisons de clés |
| écritures | Affectations dans la collection |
| mémoire | Estimation de la mémoire auxiliaire |
| valide | Ré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 tris | 6 |
| Instrumentation des opérations | 3 |
| Protocole expérimental équitable | 3 |
| Diversité des jeux de données | 2 |
| Validation automatique | 2 |
| Analyse et interprétation | 3 |
| Qualité du code et du rapport | 1 |
Synthèse du chapitre
Idée essentielle | À retenir |
|---|---|
| Tris élémentaires | Simples et utiles sur petites tailles ; insertion est le plus polyvalent |
| Tri fusion | Stable, garanti en n log n, mais mémoire O(n) sur tableau |
| Tri rapide | Excellent en pratique, en place, mais pire cas quadratique |
| Tri par tas | Garanti 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 externes | Le tri fusion est privilégié pour ses accès séquentiels |
| Choix réel | Dépend des données, de la mémoire, des garanties et du support |
Glossaire
Terme | Définition |
|---|---|
| Adaptatif | Algorithme dont le coût diminue lorsque les données sont déjà partiellement ordonnées. |
| En place | Algorithme utilisant une faible mémoire supplémentaire indépendante de n. |
| Inversion | Paire i < j telle que T[i] > T[j]. |
| Stabilité | Conservation de l’ordre relatif des éléments ayant la même clé. |
| Tri externe | Tri de données ne tenant pas entièrement en mémoire vive. |
| Tri hybride | Combinaison de plusieurs méthodes selon la taille ou l’état des données. |
| Comparateur | Fonction définissant l’ordre entre deux éléments. |
| Benchmark | Protocole 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. |