Les algorithmes
de tri

Pr. EL HADIQ Zouhair

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

1 / 22

Objectifs du chapitre

2 / 22

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 / 22

Tri par sélection — déroulement

Sur $t = [29,\ 10,\ 14,\ 37,\ 13]$ : à chaque passe, le minimum de la zone non triée est amené en tête.

PasseMinimumTableau après échange
11010 | 29, 14, 37, 13
21310, 13 | 14, 37, 29
31410, 13, 14 | 37, 29
42910, 13, 14, 29 | 37
Fin10, 13, 14, 29, 37
Au plus $n-1$ échanges : utile quand écrire une donnée coûte cher (gros enregistrements, mémoires flash).
4 / 22

Tri par sélection — complexité

À la passe $i$, la recherche du minimum de $t[i..n-1]$ demande $n-1-i$ comparaisons :

$$C(n) = \sum_{i=0}^{n-2}(n-1-i) = (n-1)+(n-2)+\dots+1 = \frac{n(n-1)}{2}$$

Ce nombre ne dépend pas du contenu : $\Theta(n^2)$ dans tous les cas. Les échanges restent en $O(n)$.
5 / 22

Tri par insertion — exercice

def tri_insertion(t): for i in range(1, len(t)): cle = t[i]; j = i - 1 while j >= 0 and t[j] > cle: t[j + 1] = t[j]; j -= 1 t[j + 1] = cle return t
À vous : 1) déroulez le tri sur $[5, 2, 4, 6, 1, 3]$ ; 2) donnez la complexité au meilleur et au pire cas.
👁️ Afficher / masquer la solution

Déroulement : 5|… → 2,5|… → 2,4,5|… → 2,4,5,6|… → 1,2,4,5,6|3 → 1,2,3,4,5,6.

Complexité : meilleur cas (déjà trié) $\Theta(n)$ ; pire cas (trié à l'envers) $\sum_{i=1}^{n-1} i = \dfrac{n(n-1)}{2} = \Theta(n^2)$. Très efficace sur données presque triées.

6 / 22

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.

7 / 22

Propriété 2 : stabilité

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

Définition mathématique. pour tout couple d'indices $i < j$ tel que $\text{clé}(t_i) = \text{clé}(t_j)$, l'élément issu de l'indice $i$ reste avant celui issu de $j$ :
$i < j \text{ et } \text{clé}(t_i)=\text{clé}(t_j) \;\Rightarrow\; \sigma(i) < \sigma(j)$

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.

8 / 22

Stabilité — exemple

On trie $[\,(3,a),\ (3,c),\ (2,b)\,]$ selon la valeur ($a$ avant $c$ au départ) :

TriRésultat(3,a) vs (3,c)
Insertion (stable)(2,b), (3,a), (3,c)a avant c ✔
Sélection (non stable)(2,b), (3,c), (3,a)c avant a ✘
Le tri par sélection échange le minimum $2$ (position 2) avec la position 0 occupée par $(3,a)$ : cet échange « à distance » envoie $(3,a)$ après $(3,c)$.

Stables : insertion, fusion. Non stables : sélection, tri rapide.

9 / 22

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.
10 / 22

Tri rapide — arbre d'appels

Sur $[3, 8, 1, 5, 2]$, pivot = 1ᵉʳ élément (rouge). On remonte en concaténant gauche + pivot + droite.

≤3 >3 ≤1 >1 ≤8 3, 8, 1, 5, 2 1, 2 8, 5 [ ] [2] [5] → [1, 2, 3, 5, 8]
11 / 22

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)
12 / 22

Tri rapide — complexité

La partition d'une liste de taille $n$ coûte $\Theta(n)$.

Meilleur cas — pivot médian, coupe en deux moitiés : $$T(n) = 2\,T(n/2) + cn \;\Rightarrow\; cn \times \log_2 n = \Theta(n\log n)$$ (travail $cn$ par niveau $\times \log_2 n$ niveaux).
Pire cas — pivot extrémal (liste déjà triée) : $$T(n)=T(n-1)+cn = c\,(n+\dots+1) = c\,\tfrac{n(n+1)}{2} = \Theta(n^2)$$

En moyenne le coût reste $\Theta(n\log n)$.

13 / 22

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.

14 / 22

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.
15 / 22

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)$.

16 / 22

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.
17 / 22

Tri par fusion — arbre

Sur $[3, 8, 1, 5, 2]$ : on descend en coupant jusqu'aux singletons, puis on remonte en fusionnant.

3, 8, 1, 5, 2 3, 8 1, 5, 2 [3] [8] [1] 5, 2 [5] [2]
Fusions successives → [1, 2, 3, 5, 8]
18 / 22

Tri par fusion — exercice

À vous : 1) fusionnez $A=[1,4,7]$ et $B=[2,3,9]$ étape par étape ; 2) établissez la récurrence de $T(n)$ et la complexité au pire cas.
👁️ Afficher / masquer la solution

Fusion : 1≤2→[1] ; 4>2→[1,2] ; 4>3→[1,2,3] ; 4≤9→[1,2,3,4] ; 7≤9→[1,2,3,4,7] ; reste 9 → [1,2,3,4,7,9]. Coût $\Theta(m+p)$.

Récurrence : $T(n)=2T(n/2)+cn$. Coupe en deux moitiés garantie ⇒ $cn$ par niveau $\times \log_2 n$ niveaux $= \Theta(n\log n)$ au meilleur, moyen et pire cas (pas de cas dégradé).

19 / 22

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)$.
20 / 22

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
21 / 22

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)
22 / 22