Aller au contenu principal

Module 04 · Leçon 1

Tri par sélection

180 minanalyse · pascal
Affichage du code

Ce que vous saurez faire

  • Décrire l'algorithme de tri par sélection
  • Implémenter le tri par sélection en algorithmique et Pascal
  • Analyser sa complexité quadratique

Avant de commencer

Vous avez un tas de copies à classer par note. Naturellement, vous cherchez la plus basse, vous la mettez en premier, puis la suivante, etc. C'est exactement le tri par sélection.


1. L'idée

À chaque tour i, on cherche le minimum dans la portion T[i..n] et on l'échange avec T[i]. Après n − 1 tours, le tableau est trié.

Étape 1 : [5, 2, 8, 1, 4]  →  min en pos 4 (valeur 1)  →  échange T[1] ↔ T[4]
          [1, 2, 8, 5, 4]
Étape 2 : on cherche min dans T[2..5]  →  déjà en pos 2 (valeur 2)
          [1, 2, 8, 5, 4]
Étape 3 : min dans T[3..5] = 4 (pos 5)  →  échange T[3] ↔ T[5]
          [1, 2, 4, 5, 8]
Étape 4 : min dans T[4..5] = 5  →  déjà en place
          [1, 2, 4, 5, 8]  ← trié

2. L'algorithme

DEF PROC Tri_Selection(VAR T : Tableau, n : entier)
  Pour i de 1 à n-1 Faire
    pos_min ← i
    Pour j de i+1 à n Faire
      Si T[j] < T[pos_min] Alors
        pos_min ← j
      FinSi
    FinPour
    Si pos_min ≠ i Alors
      Echanger(T[i], T[pos_min])
    FinSi
  FinPour
Fin Tri_Selection
DEF PROC Echanger(VAR a, b : entier)
  temp ← a
  a ← b
  b ← temp
Fin Echanger

DEF PROC Tri_Selection(VAR T : Tab, n : entier)
  Pour i de 1 à n-1 Faire
    pos_min ← i
    Pour j de i+1 à n Faire
      Si T[j] < T[pos_min] Alors
        pos_min ← j
      FinSi
    FinPour
    Si pos_min ≠ i Alors
      Echanger(T[i], T[pos_min])
    FinSi
  FinPour
Fin Tri_Selection

3. Trace d'exécution

Sur T = [5, 2, 8, 1, 4] (n=5) :

Trace d'exécution
0 / 5
Instructionipos_minTableau
01···???
02···???
03···???
04···???
05···???

4. Complexité

À chaque tour i, on fait n − i comparaisons. Total : (n−1) + (n−2) + … + 1 = n(n−1)/2 ≈ n²/2.

Le tri par sélection est quadratique : O(n²). Pour 1000 éléments, environ 500 000 comparaisons.


5. Exercices

Exercice 1facile
Premier tour

Soit T = [9, 4, 7, 2, 8]. Donner l'état du tableau après le premier tour du tri par sélection.

Voir le corrigé

Le minimum est 2 en position 4. On l'échange avec T[1]=9 :

[2, 4, 7, 9, 8]

Exercice 2moyen
Tri décroissant (type bac courant)

Adapter l'algorithme pour trier en ordre décroissant (du plus grand au plus petit).

Voir le corrigé

Il suffit d'inverser le test : chercher le maximum au lieu du minimum.

PROCEDURE Tri_Decroissant(VAR T : Tab; n : integer);
VAR
  i, j, pos_max : integer;
BEGIN
  FOR i := 1 TO n - 1 DO
  BEGIN
    pos_max := i;
    FOR j := i + 1 TO n DO
      IF T[j] > T[pos_max] THEN     { > au lieu de < }
        pos_max := j;
    Echanger(T[i], T[pos_max]);
  END;
END;
Exercice 3difficile
Compter les échanges (hors bac, bonus)

Modifier le tri par sélection pour qu'il compte le nombre d'échanges effectifs (en ne comptant pas ceux où pos_min = i). Retourner ce nombre via un paramètre VAR.

Voir le corrigé
PROCEDURE Tri_Selection_Compte(VAR T : Tab; n : integer; VAR nb_ech : integer);
VAR
  i, j, pos_min : integer;
BEGIN
  nb_ech := 0;
  FOR i := 1 TO n - 1 DO
  BEGIN
    pos_min := i;
    FOR j := i + 1 TO n DO
      IF T[j] < T[pos_min] THEN
        pos_min := j;
    IF pos_min <> i THEN
    BEGIN
      Echanger(T[i], T[pos_min]);
      nb_ech := nb_ech + 1;
    END;
  END;
END;

6. Erreurs fréquentes au bac

  • Boucle externe Pour i de 1 à n (au lieu de n-1) : un tour de trop.
  • Boucle interne Pour j de 1 à n (au lieu de i+1) : on remet en question des éléments déjà triés.
  • Oublier d'utiliser pos_min pour mémoriser la position : on échange alors avec une mauvaise case.

7. Quiz

Quiz (5 questions)

1

À chaque tour du tri par sélection, on cherche :

2

Complexité du tri par sélection sur un tableau de n éléments :

3

Sur le tableau [3, 1, 4, 1, 5], après 2 tours, le tableau vaut :

4

Pour quel cas le tri par sélection fait-il LE PLUS de comparaisons ?

5

Combien de variables auxiliaires utilise le tri par sélection (hors paramètres) ?

Bravo d'être arrivé jusqu'ici. Marquez la leçon terminée pour ancrer le progrès.