Aller au contenu principal

Informatique · Première · 5 min de lecture

Trier un tableau : sélection et insertion

Tri par sélection : à l'étape i, on cherche le minimum de la partie non triée et on l'échange avec l'élément d'indice i ; il effectue toujours n(n − 1)/2 comparaisons. Tri par insertion : on insère chaque élément à sa place dans la partie déjà triée, en décalant les plus grands ; de n − 1 comparaisons (tableau déjà trié) à n(n − 1)/2 (tableau trié à l'envers). Invariant de boucle (« après l'étape i, les i + 1 premiers éléments sont triés »), terminaison, coût quadratique dans le pire cas.

Chapitre du programme : Numérique et sciences informatiques (spécialité)

Bloc 1 sur 7 · Comprendre

Comprendre : deux façons de ranger

Trier un tableau, c'est réordonner ses éléments du plus petit au plus grand. Les deux tris du programme construisent tous deux une partie triée à gauche du tableau, qui grandit d'une case à chaque tour ; ils diffèrent par la façon de la faire grandir.

Tri par sélection. Au tour i, on cherche le minimum de la partie non triée (des indices i à la fin) et on l'échange avec l'élément d'indice i.

def tri_selection(t):
    for i in range(len(t) - 1):
        m = i
        for j in range(i + 1, len(t)):
            if t[j] < t[m]:
                m = j
        t[i], t[m] = t[m], t[i]
        print(t)

t = [29, 11, 35, 7, 18]
tri_selection(t)
[7, 11, 35, 29, 18]
[7, 11, 35, 29, 18]
[7, 11, 18, 29, 35]
[7, 11, 18, 29, 35]

Le print(t) placé à la fin de chaque tour montre le tableau après chaque échange. Au deuxième tour, 11 est déjà le minimum de la partie non triée : il est « échangé » avec lui-même, le tableau ne change pas.

Tri par insertion. Au tour i, on prend l'élément t[i] et on l'insère à sa place dans la partie déjà triée, en décalant d'une case vers la droite les éléments plus grands que lui.

def tri_insertion(t):
    for i in range(1, len(t)):
        x = t[i]
        j = i
        while j > 0 and t[j - 1] > x:
            t[j] = t[j - 1]
            j = j - 1
        t[j] = x
        print(t)

t = [29, 11, 35, 7, 18]
tri_insertion(t)
[11, 29, 35, 7, 18]
[11, 29, 35, 7, 18]
[7, 11, 29, 35, 18]
[7, 11, 18, 29, 35]

Bloc 2 sur 7 · Approfondir

Approfondir : invariant, terminaison et coût

Invariant de boucle. C'est une propriété vraie avant le premier tour et conservée par chaque tour ; à la sortie, elle prouve que le résultat est correct.

  • Tri par sélection : « après le tour i, les i + 1 premiers éléments sont triés et sont inférieurs ou égaux à tous les éléments restants ». La seconde moitié de la phrase est essentielle : c'est elle qui garantit que ces éléments ne bougeront plus.
  • Tri par insertion : « après le tour i, les i + 1 premiers éléments sont ceux du début du tableau d'origine, rangés dans l'ordre croissant ». Ils peuvent encore être décalés plus tard.

Terminaison. Les boucles for font un nombre fini de tours. La boucle while du tri par insertion s'arrête aussi : j diminue de 1 à chaque tour et la condition exige j > 0.

Coût. Le tri par sélection fait toujours le même nombre de comparaisons : (n − 1) + (n − 2) + … + 1 = n(n − 1)/2, quel que soit l'ordre de départ. Compté par programme :

def comparaisons_selection(n):
    c = 0
    for i in range(n - 1):
        for j in range(i + 1, n):
            c = c + 1
    return c

for n in [10, 20, 40]:
    print(n, comparaisons_selection(n))
10 45
20 190
40 780

Quand n double, le nombre de comparaisons est multiplié par environ 4 : le coût est quadratique. Le tri par insertion fait au pire n(n − 1)/2 comparaisons (tableau trié à l'envers) ; sur un tableau déjà trié, il n'en fait que n − 1.

Bloc 3 sur 7 · Exemple

Exemple guidé : tri par sélection de [5, 3, 8, 1]

Énoncé. Dérouler le tri par sélection sur [5, 3, 8, 1] et compter les comparaisons.

Tableau : Tour, Partie non triée, Minimum, Échange, Tableau après le tour, Comparaisons
TourPartie non triéeMinimumÉchangeTableau après le tourComparaisons
i = 0[5, 3, 8, 1]1t[0] ↔ t[3][1, 3, 8, 5]3
i = 1[3, 8, 5]3t[1] ↔ t[1][1, 3, 8, 5]2
i = 2[8, 5]5t[2] ↔ t[3][1, 3, 5, 8]1

Au total, 3 + 2 + 1 = 6 comparaisons, c'est-à-dire 4 × 3 / 2. Le dernier élément n'a pas besoin de tour : quand tous les autres sont placés, il l'est aussi.

Bloc 4 sur 7 · Visualiser

Voir : ce qui distingue les deux tris

Tableau : Sélection, Insertion
SélectionInsertion
Au tour i, on…cherche le minimum du resteinsère t[i] dans la partie triée
Partie gauche après le tourdéfinitivetriée mais provisoire
Comparaisons, tableau déjà trién(n − 1)/2n − 1
Comparaisons, pire casn(n − 1)/2n(n − 1)/2
Coût dans le pire casquadratiquequadratique

Continuez sur votre lancée

Vous avez découvert l’essentiel et un exemple. Retrouvez la suite du cours et les points à retenir, puis passez à l’entraînement guidé dans votre compte.

  • Les formules et les repères à retenir
  • Les erreurs fréquentes expliquées
  • Un exercice avec des aides et sa correction

L’accès gratuit comprend les cours et exercices de votre niveau choisi.

Sources

  • BO spécial n°1 du 22 janvier 2019 — programme de spécialité numérique et sciences informatiques de première, rubrique « Algorithmique »
  • T. H. Cormen, C. E. Leiserson, R. L. Rivest, C. Stein, Algorithmique (Introduction to Algorithms), 3e édition française, Dunod — tri par insertion, invariant de boucle

Vous pensez avoir trouvé une erreur dans cette leçon ? Signalez-la par e-mail.

Explorer les autres cours

Accès rapide