Les tris : sélection et insertion⚓︎
Fiche méthode & révision — Première NSI · Chapitre 7
Fiche compacte pour dérouler et programmer le tri par sélection et le tri par insertion : principe, code, traces, complexités, stabilité, invariant et terminaison.
Exemple filé
Liste de départ : [5, 2, 4, 1] → triée : [1, 2, 4, 5].
1. Objectifs⚓︎
À la fin du chapitre, vous devez savoir :
- connaître les algorithmes de tri par sélection et par insertion ;
- expliquer le rôle de la partie triée / non triée ;
- tracer un tri à la main (tableau de suivi) ;
- compléter et programmer les deux tris ;
- comparer leurs complexités et leur stabilité.
2. Définitions essentielles⚓︎
| Terme | Définition |
|---|---|
| Tri | Ranger des éléments dans un ordre. |
| Classement | Résultat ordonné. |
| Ordre croissant / décroissant | Du plus petit au plus grand / l'inverse. |
| Partie triée | Portion déjà en ordre. |
| Partie non triée | Portion restant à traiter. |
| Indice du minimum | Position du plus petit élément. |
| Échange | Permuter deux valeurs. |
| Décalage | Déplacer des éléments d'une case. |
| Insertion | Placer une valeur à sa bonne position. |
| Stabilité | Conserve l'ordre des éléments égaux. |
| Invariant | Propriété vraie à chaque tour de boucle. |
| Correction partielle | Si l'algo s'arrête, le résultat est trié. |
| Terminaison | L'algo s'arrête toujours. |
| Meilleur / pire cas | Situation la moins / la plus coûteuse. |
3. Tri par sélection⚓︎
Principe
On sépare la liste en partie triée (à gauche) et non triée (à droite). À chaque tour, on cherche le minimum de la partie non triée et on l'échange avec le premier élément non trié.
def tri_selection(T):
n = len(T)
for i in range(n - 1):
mini = i
for j in range(i + 1, n):
if T[j] < T[mini]:
mini = j
T[i], T[mini] = T[mini], T[i] # échange final
- boucle extérieure sur
i(début de la partie non triée) ; mini = i(on suppose le minimum au début) ;- recherche dans
T[i+1:n], mise à jour deminisi plus petit ; - échange
T[i]↔T[mini]; la zone triée grandit d'une case.
Propriétés
- Complexité :
O(n²)(toujours, même si déjà triée) ; - non stable dans la version classique (l'échange peut inverser des égaux) ;
- invariant : après le tour
i,T[0..i]contient lesi+1plus petits, triés ; - terminaison : deux boucles
forbornées.
4. Échanger deux valeurs⚓︎
temp = T[a]
T[a] = T[b]
T[b] = temp
# version courte : T[a], T[b] = T[b], T[a]
- une variable temporaire évite d'écraser une valeur ;
- vérifier : avant
T[a]=x, T[b]=y→ aprèsT[a]=y, T[b]=x.
5. Tri par insertion⚓︎
Principe
La première valeur est considérée comme triée. On prend chaque valeur
suivante (tmp) et on la glisse à sa place en décalant vers la droite les
éléments plus grands.
def tri_insertion(T):
n = len(T)
for i in range(1, n):
tmp = T[i]
j = i - 1
while j >= 0 and T[j] > tmp:
T[j + 1] = T[j] # décalage
j -= 1
T[j + 1] = tmp # insertion
tmp = T[i]: valeur à insérer ;j = i - 1;- décalage tant que
T[j] > tmp(etj >= 0), avecj -= 1; - insertion en
j + 1.
Propriétés
- Meilleur cas
O(n)(déjà triée) ; pire casO(n²)(ordre inverse) ; - stable ;
- invariant : après le tour
i,T[0..i]est trié ; - terminaison :
forborné ; dans lewhile,jdécroît.
6. Tableau comparatif⚓︎
| Critère | Sélection | Insertion |
|---|---|---|
| Principe | chercher le minimum | insérer à sa place |
| Partie triée | à gauche | à gauche |
| Opérations | recherche + échange | décalages + insertion |
| Boucles | deux for |
for + while |
| Stabilité | non (version classique) | oui |
| Meilleur cas | O(n²) |
O(n) |
| Pire cas | O(n²) |
O(n²) |
| Avantage | peu d'échanges | rapide si presque trié |
| Limite | toujours O(n²) |
lent si ordre inverse |
7. Méthodes⚓︎
Dérouler un tri à la main
- Étapes : appliquer l'algorithme tour par tour, réécrire la liste à chaque étape.
- Vérif : la partie triée grandit d'une case par tour.
Rechercher le minimum d'une sous-liste
- Supposer le minimum au début (
mini = i), parcourir, mettre à jour si plus petit.
Mémoriser l'indice du minimum
- Stocker l'indice (
mini), pas la valeur : c'est lui qui sert à l'échange.
Choisir les bornes de range
- Sélection : extérieure
range(n-1), intérieurerange(i+1, n). - Erreur : oublier le dernier élément (mauvaise borne).
Réaliser un tri décroissant
- Sélection : chercher le maximum (
T[j] > T[mini]). - Insertion : décaler tant que
T[j] < tmp.
Trier en partant de la fin
- Variante : faire progresser la zone triée depuis la droite (adapter les bornes).
Suivre i, j, mini ou tmp
- Tenir un tableau de trace avec ces variables à chaque tour.
Compléter un code à trous
- Repérer : init (
mini=i/tmp=T[i]), condition, mise à jour (j-=1), placement final.
Calculer le nombre de comparaisons
- Sélection :
n(n-1)/2comparaisons (toujours).
Justifier un invariant
- Énoncer la propriété vraie à chaque tour (partie gauche triée).
Prouver la terminaison
- Boucles
forbornées ; dans l'insertion,jdécroît strictement.
8. Tableaux de trace⚓︎
Sélection sur [5, 2, 4, 1]
Tour i |
mini final |
Échange | Liste après |
|---|---|---|---|
| 0 | 3 (valeur 1) | T[0]↔T[3] | [1, 2, 4, 5] |
| 1 | 1 (valeur 2) | T[1]↔T[1] | [1, 2, 4, 5] |
| 2 | 2 (valeur 4) | T[2]↔T[2] | [1, 2, 4, 5] |
Modèle complet : tour · i · j · mini · comparaison · échange · liste.
Insertion sur [5, 2, 4, 1]
Tour i |
tmp |
Décalages | Liste après |
|---|---|---|---|
| 1 | 2 | 5 → droite | [2, 5, 4, 1] |
| 2 | 4 | 5 → droite | [2, 4, 5, 1] |
| 3 | 1 | 5, 4, 2 → droite | [1, 2, 4, 5] |
Modèle complet : tour · i · tmp · j · condition · décalage · liste.
9. Erreurs fréquentes⚓︎
| Erreur | Cause / correction |
|---|---|
| Confondre minimum et indice | mémoriser l'indice mini |
Réinitialiser mini au mauvais endroit |
mini = i au début de chaque tour |
| Échanger à chaque comparaison | échanger une fois, à la fin du tour |
| Mauvaise borne de boucle | range(i+1, n) (intérieure) |
| Oublier le dernier élément | vérifier les bornes |
| Écraser la valeur à insérer | sauver tmp = T[i] d'abord |
Oublier j -= 1 |
sinon boucle infinie |
Insérer en j au lieu de j+1 |
la position correcte est j + 1 |
| Confondre échange et décalage | sélection = échange ; insertion = décalage |
| Dire que la sélection est stable | la version classique ne l'est pas |
| Oublier les cas de l'insertion | meilleur O(n), pire O(n²) |
| Modifier une copie au lieu de la liste | trier la liste attendue (en place) |
10. Questions-réponses corrigées⚓︎
Vocabulaire⚓︎
1. (N1) Qu'est-ce que la partie triée ?
La portion de la liste déjà en ordre (à gauche).
2. (N1) Qu'est-ce que la stabilité d'un tri ?
Il conserve l'ordre des éléments égaux.
3. (N2) Qu'est-ce qu'un invariant de boucle ?
Une propriété vraie à chaque tour (ici, partie gauche triée).
4. (N1) Différence entre échange et décalage ?
L'échange permute deux valeurs ; le décalage déplace des éléments d'une case.
5. (N2) Que signifie « trier en place » ?
Modifier directement la liste, sans en créer une copie.
Compréhension⚓︎
6. (N1) Quelle complexité a le tri par sélection ?
O(n²), toujours.
7. (N2) Pourquoi le tri par insertion est-il O(n) au meilleur cas ?
Si la liste est déjà triée, le while ne décale jamais.
8. (N2) Le tri par sélection classique est-il stable ?
Non : l'échange peut inverser des éléments égaux.
9. (N3) Pourquoi le tri par insertion termine-t-il ?
Le for est borné et, dans le while, j décroît strictement.
10. (N2) Quand l'insertion est-elle plus avantageuse que la sélection ?
Quand la liste est presque triée.
Traces⚓︎
11. (N1) Sélection sur [5,2,4,1], tour 0 : quel indice de minimum ?
3 (la valeur 1).
12. (N2) Liste après le tour 0 de la sélection ?
[1, 2, 4, 5].
13. (N2) Insertion sur [5,2,4,1], tour 1 : tmp et liste ?
tmp = 2, liste [2, 5, 4, 1].
14. (N3) Insertion, tour 3 : combien de décalages ?
Trois (5, 4, 2 décalés) pour insérer 1.
15. (N3) Combien de comparaisons pour la sélection sur 4 éléments ?
4 × 3 / 2 = 6.
Lecture de code⚓︎
16. (N1) Dans la sélection, que vaut mini au début de chaque tour ?
i.
17. (N2) Dans l'insertion, à quoi sert tmp ?
À sauver la valeur à insérer avant les décalages.
18. (N2) Pourquoi T[j+1] = tmp et non T[j] = tmp ?
Parce qu'après le while, j a été décrémenté une fois de trop.
19. (N3) Que se passe-t-il si on oublie j -= 1 ?
Boucle infinie (la condition reste vraie).
20. (N2) Que fait T[i], T[mini] = T[mini], T[i] ?
Un échange des deux valeurs.
Méthode⚓︎
21. (N1) Comment trouver l'indice du minimum d'une sous-liste ?
Supposer mini = i, parcourir, mettre à jour si T[j] < T[mini].
22. (N2) Comment passer la sélection en tri décroissant ?
Chercher le maximum (T[j] > T[mini]).
23. (N2) Comment passer l'insertion en tri décroissant ?
Décaler tant que T[j] < tmp.
24. (N3) Comment justifier l'invariant de la sélection ?
Après le tour i, T[0..i] contient les i+1 plus petits, triés.
25. (N3) Combien de comparaisons fait la sélection sur n éléments ?
n(n-1)/2.
Correction d'erreurs⚓︎
26. (N1) mini = 0 placé avant la boucle extérieure : erreur ?
Il faut mini = i à chaque tour.
27. (N2) Échanger à chaque fois que T[j] < T[mini] : erreur ?
On ne fait qu'un seul échange, à la fin du tour.
28. (N2) range(i, n) pour la boucle intérieure de la sélection : erreur ?
range(i+1, n) (on part après i).
29. (N3) T[j] = tmp au lieu de T[j+1] = tmp : erreur ?
On insère à la mauvaise position : c'est j + 1.
30. (N2) Oublier tmp = T[i] dans l'insertion : conséquence ?
La valeur à insérer est écrasée par le décalage.
Programmation / code à compléter⚓︎
31. (N1) Compléter l'init de la sélection : ____ = i.
mini = i.
32. (N2) Compléter la condition du while de l'insertion.
while j >= 0 and T[j] > tmp:.
33. (N2) Écrire l'échange de T[i] et T[mini].
T[i], T[mini] = T[mini], T[i].
34. (N3) Compléter l'insertion finale.
T[j + 1] = tmp.
35. (N4) Écrire un tri par sélection décroissant.
for i in range(len(T) - 1):
maxi = i
for j in range(i + 1, len(T)):
if T[j] > T[maxi]:
maxi = j
T[i], T[maxi] = T[maxi], T[i]
11. Exercices flash corrigés⚓︎
Trouver le minimum et son indice de [4, 1, 3]
Minimum 1, indice 1.
Effectuer un échange de T[0] et T[2] dans [4,1,3]
[3, 1, 4].
Compléter les bornes : boucle intérieure de la sélection
range(i + 1, n).
Donner un tour de sélection sur [3, 1, 2] (i=0)
Minimum à l'indice 1 → échange → [1, 3, 2].
Décaler pour insérer 2 dans [1, 3, 5 | …]
3 et 5 décalés ; 2 inséré après 1 → [1, 2, 3, 5].
Prévoir l'état de [2,1] après un tour d'insertion
[1, 2].
Identifier le tri : « on décale puis on insère »
Tri par insertion.
Déterminer stabilité et complexité de l'insertion
Stable ; meilleur O(n), pire O(n²).
À retenir absolument⚓︎
Les deux algorithmes
# SÉLECTION : chercher le min, échanger
for i in range(n-1):
mini = i
for j in range(i+1, n):
if T[j] < T[mini]: mini = j
T[i], T[mini] = T[mini], T[i]
# INSERTION : décaler, insérer
for i in range(1, n):
tmp = T[i]; j = i - 1
while j >= 0 and T[j] > tmp:
T[j+1] = T[j]; j -= 1
T[j+1] = tmp
Variables, invariants, complexités, stabilité
| Sélection | Insertion | |
|---|---|---|
| Variables | i, j, mini |
i, j, tmp |
| Invariant | T[0..i] = i+1 plus petits triés |
T[0..i] trié |
| Meilleur / pire | O(n²) / O(n²) |
O(n) / O(n²) |
| Stable | non | oui |
Réflexes
- sélection = min + échange ; insertion = décalage + insertion en
j+1; - ne pas oublier
mini = ià chaque tour, nij -= 1dans lewhile; - terminaison : boucles bornées ; dans l'insertion,
jdécroît.