Les algorithmes
de tri

Pr. EL HADIQ Zouhair

Informatique CPGE — MP / PSI · Première période

1 / 15

Objectifs du chapitre

2 / 15

Rappel : les tris simples

TriPrincipePire cas
SélectionPlacer le minimum en tête, recommencer.$O(n^2)$
InsertionInsérer chaque élément dans la partie triée.$O(n^2)$
À bullesÉchanger les voisins mal ordonnés.$O(n^2)$

Le tri par sélection effectue $(n-1)+(n-2)+\dots+1 = \dfrac{n(n-1)}{2}$ comparaisons.

Objectif : passer de $O(n^2)$ à $O(n\log n)$.
3 / 15

Propriété 1 : tri en place

Un tri est en place s'il n'utilise qu'une mémoire supplémentaire constante $O(1)$, en réorganisant les éléments à l'intérieur du tableau d'origine.

Pas de copie de taille $n$ : on permute les cases sur place.

Exemples : tri par sélection, tri par insertion, tri rapide (version classique) sont en place. Le tri par fusion ne l'est pas.

4 / 15

Propriété 2 : stabilité

Un tri est stable s'il conserve l'ordre relatif initial des éléments de clé égale.

Utile pour trier selon plusieurs critères successifs : trier par âge une liste déjà triée par prénom garde l'ordre alphabétique à âge égal.

Insertion et fusion sont stables ; sélection et tri rapide ne le sont pas.

5 / 15

Tri rapide — principe

Diviser pour régner avec un pivot :

  1. Choisir un pivot dans la liste.
  2. Partition : placer les éléments $\leq$ pivot à gauche, les $>$ pivot à droite. Le pivot est à sa place définitive.
  3. Trier récursivement la sous-liste gauche et la droite.
6 / 15

Tri rapide — implémentation

def tri_rapide(L): if len(L) <= 1: return L pivot = L[0] petits = [x for x in L[1:] if x <= pivot] grands = [x for x in L[1:] if x > pivot] return tri_rapide(petits) + [pivot] + tri_rapide(grands)
7 / 15

Tri rapide — complexité

En moyenne, la partition équilibre les deux côtés :

$$T(n) = 2\,T(n/2) + O(n) \;\Longrightarrow\; O(n\log n)$$

Pire des cas (pivot toujours extrémal, ex. liste déjà triée) : $T(n)=T(n-1)+O(n) \Rightarrow O(n^2)$.
8 / 15

Tri rapide — choix du pivot

Prendre toujours le premier élément rend le pire cas $O(n^2)$ fréquent (listes déjà triées).

Pour rendre le pire cas improbable :

Le tri rapide classique est en place mais non stable.

9 / 15

Tri par fusion — principe

Diviser pour régner sans pivot :

  1. Couper la liste en deux moitiés.
  2. Trier récursivement chaque moitié.
  3. Fusionner les deux moitiés triées en une seule liste triée.
10 / 15

L'étape de fusion

def fusion(A, B): C = [] i, j = 0, 0 while i < len(A) and j < len(B): if A[i] <= B[j]: C.append(A[i]); i += 1 else: C.append(B[j]); j += 1 return C + A[i:] + B[j:]

Fusion de deux listes de tailles $m$ et $p$ en $O(m+p)$.

11 / 15

Tri par fusion — implémentation

def tri_fusion(L): if len(L) <= 1: return L m = len(L) // 2 gauche = tri_fusion(L[:m]) droite = tri_fusion(L[m:]) return fusion(gauche, droite)
$T(n) = 2\,T(n/2) + O(n) \Rightarrow O(n\log n)$ garanti, même au pire cas.
12 / 15

Tri par fusion — propriétés

Compromis : le tri fusion garantit $O(n\log n)$ et la stabilité, au prix de la mémoire ; le tri rapide est en place mais risque $O(n^2)$.
13 / 15

Comparaison des tris

TriMoyennePireEn placeStable
Sélection$O(n^2)$$O(n^2)$OuiNon
Insertion$O(n^2)$$O(n^2)$OuiOui
Rapide$O(n\log n)$$O(n^2)$OuiNon
Fusion$O(n\log n)$$O(n\log n)$NonOui
14 / 15

Récapitulatif

Tri rapide$O(n\log n)$ moyen, en place, non stable
Tri fusion$O(n\log n)$ garanti, stable, $O(n)$ espace
Pivotchoix crucial (aléatoire / médiane)
15 / 15