Première · Algorithmique

Le tri par insertion

Quand on range une nouvelle carte dans une main déjà ordonnée, on décale les cartes trop grandes puis on glisse la nouvelle à sa place. Le tri par insertion construit ainsi progressivement un préfixe trié, sans connaître d’avance les plus petites valeurs du tableau.

SofienAvec SofienIngénieur et enseignant en informatique
Dans ce chapitre

Un cap pour ce chapitre

Ce que vous saurez faire

  • Exécuter les décalages et l’insertion.
  • Justifier la conservation et l’ordre des valeurs.
  • Comparer meilleur et pire cas.
Les bases utiles pour commencer

Agrandir une partie déjà triée

La première valeur forme à elle seule une partie triée. Au passage i = 1, on insère la deuxième dans cette partie. Au passage suivant, on insère la troisième dans les deux précédentes, et ainsi de suite. Pour [5, 2, 4, 1], les états successifs sont [2, 5, 4, 1], [2, 4, 5, 1] puis [1, 2, 4, 5].

Contrairement à la sélection, le préfixe trié ne contient pas nécessairement les plus petites valeurs du tableau entier. Après le premier passage, 1 reste à droite. Le préfixe rassemble les valeurs initialement rencontrées, mais dans le bon ordre.

Sauvegarder avant de décaler

La valeur à insérer doit être conservée dans une variable avant tout déplacement. On compare ensuite les éléments du préfixe en remontant depuis sa fin. Tant qu’ils sont strictement plus grands, on les décale d’une case vers la droite. Quand on atteint une valeur plus petite ou égale, ou le début du tableau, on place la valeur sauvegardée dans l’espace disponible.

Il faut tester que l’indice reste valide avant de lire la case. En Python, les indices négatifs désignent des cases depuis la fin ; ils ne signalent pas automatiquement l’erreur logique qu’un dépassement à gauche pourrait provoquer.

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

Pendant les décalages, le tableau peut provisoirement contenir deux copies d’une même valeur. Ce n’est pas une perte de donnée si la valeur à insérer est conservée ailleurs. L’ensemble « tableau plus variable sauvegardée plus emplacement libre » représente l’état réel du raisonnement. Regardez donc aussi les variables temporaires, et pas seulement la photographie intermédiaire du tableau.

Construire la preuve avec le préfixe

Au début du passage i, les i premières cases sont triées et contiennent les valeurs initiales de ce préfixe. Les décalages laissent entre elles les valeurs supérieures dans le même ordre. L’insertion place la valeur courante après les valeurs inférieures ou égales et avant les valeurs supérieures. Le préfixe de longueur i + 1 est donc trié.

La sauvegarde permet de conserver chaque valeur malgré les copies temporaires. Pour la terminaison de la boucle interne, l’indice j diminue à chaque décalage et ne peut pas rester indéfiniment positif. La boucle externe est bornée par la taille du tableau.

L’ordre initial change le travail

Dans un tableau déjà trié, chaque nouvelle valeur est immédiatement à la bonne place : une comparaison de valeurs suffit par passage et aucun décalage n’est nécessaire. Dans un tableau strictement décroissant, chaque valeur doit passer devant toutes les précédentes. Il y a alors 1 + 2 + … + (n - 1) décalages, soit n(n - 1) / 2.

Le pire coût est quadratique, mais le meilleur cas est linéaire pour cette version. L’atelier compte les comparaisons entre valeurs et les décalages séparément ; les tests d’indice ne figurent pas dans ce compteur. Cette convention doit rester identique lorsque l’on compare deux exemples.

Pour [2,5,8,4], la dernière insertion compare 8 à 4, puis 5 à 4, puis 2 à 4. Deux comparaisons déclenchent un décalage ; la troisième arrête la remontée. Le nombre de comparaisons peut donc dépasser celui des décalages. En revanche, quand la remontée atteint le bord gauche, l’arrêt peut être déterminé par l’indice sans dernière comparaison entre valeurs.

Exemple suivi : ouvrir une place sans perdre la clé

Insérons 3 dans le préfixe [1,4,6], suivi de 3. On sauvegarde d’abord valeur=3. Copier 6 vers la droite donne provisoirement [1,4,6,6]. Copier 4 donne [1,4,4,6]. La comparaison avec 1 arrête la boucle ; écrire la sauvegarde dans la case libre produit [1,3,4,6].

Le chemin des indices est aussi important : on commence à 2, on passe à 1 puis à 0, et on insère à j+1=1. L’algorithme ne perd pas 3 puisque la variable le conserve. Pour une valeur plus petite que toutes les précédentes, les indices vont jusqu’à -1 puis l’insertion se fait à 0. Le test de validité doit précéder l’accès à la case, en particulier dans Python où un indice négatif peut donner une valeur valide mais indésirable.

Doublons, stabilité et jeu de tests

Approfondissement : avec un décalage uniquement lorsque la clé précédente est strictement supérieure, les clés égales gardent leur ordre relatif. Sur [(2,A),(2,B),(1,C)], A ne se déplace pas devant B lors de l’insertion de B. L’insertion de C décale ensuite B puis A, mais leur ordre relatif final reste A puis B. On appelle stable un tri possédant cette propriété.

Pour vérifier la version numérique, prenez un tableau vide, un singleton, une suite croissante, une suite décroissante et des répétitions. Le vide et le singleton ne nécessitent aucune insertion. La suite croissante vérifie l’arrêt immédiat des boucles internes ; la décroissante force le passage jusqu’au bord gauche. Les répétitions vérifient que le test strict ne décale pas inutilement les égaux. Un unique tableau mélangé ne met pas nécessairement en évidence toutes ces branches.

À vous de faire varier les choses

Observez les cartes qui se décalent

Comparez un tableau croissant, décroissant ou presque trié. Avancez les insertions et observez les deux compteurs.

Lire le résultat de l’expérience initiale

Après 1 insertion(s) : [2, 5, 4, 1]

Le préfixe est trié, mais des valeurs plus petites peuvent encore être présentes à droite. Les tests d’indice ne sont pas comptés.

Valeur inséréePosition finaleTableau
202, 5, 4, 1

Le nombre de décalages révèle à quel point chaque nouvelle valeur était éloignée de sa place.

De la compréhension à l’autonomie

À vous de résoudre

Cherchez d’abord par vous-même. Vérifiez les résultats demandés, utilisez les indices si nécessaire, puis comparez votre méthode à la correction.

Exercice 1 · Appliquer#

Une insertion complète

Le préfixe [2, 5, 8] est trié et la valeur suivante est 4. Donnez les décalages puis le préfixe obtenu.

Indice 1

Sauvegardez 4 avant de toucher au tableau.

Indice 2

Seules les valeurs strictement supérieures à 4 sont déplacées.

Comprendre la correction

On décale 8 puis 5 vers la droite. La valeur 2 est inférieure à 4 et arrête la remontée. On insère 4 après 2 : le préfixe devient [2, 4, 5, 8]. Deux décalages ont lieu, mais trois comparaisons de valeurs sont nécessaires pour constater l’arrêt sur 2.

Exercice 2 · Calculer#

Déjà trié

Combien de décalages et de comparaisons entre valeurs faut-il pour trier [1, 3, 6, 9] avec le code donné ?

Indice 1

Il y a trois passages.

Indice 2

À chaque passage, la première comparaison est fausse.

Comprendre la correction

Il faut zéro décalage et trois comparaisons entre valeurs. Les valeurs sont déjà ordonnées, mais l’algorithme doit le constater à chaque insertion. Ce meilleur cas est linéaire ; il ne permet pas d’affirmer que le tri sera aussi rapide pour tout tableau.

Exercice 3 · Corriger#

Une valeur écrasée

Un élève commence à décaler t[i - 1] dans t[i] avant de sauvegarder t[i]. Pourquoi son tri peut-il perdre une donnée ?

Indice 1

La case t[i] contenait la nouvelle valeur.

Indice 2

Une copie n’offre pas de sauvegarde automatique de l’ancien contenu.

Comprendre la correction

La valeur à insérer est écrasée par la copie du voisin. Il peut alors rester deux occurrences du voisin et aucune de la valeur initiale. On sauvegarde d’abord valeur = t[i], puis on réalise les décalages et enfin l’insertion de cette sauvegarde.

Exercice 4 · Justifier#

Comparer deux invariants

Après un passage d’insertion, le préfixe contient-il toujours les plus petites valeurs du tableau entier ? Donnez un contre-exemple.

Indice 1

Considérez [5, 2, 4, 1].

Indice 2

Observez l’état après la première insertion.

Comprendre la correction

Non : après la première insertion, le préfixe [2, 5] est trié mais la valeur 1 reste à droite. L’invariant porte sur les valeurs déjà rencontrées. Dire qu’il contient les plus petites de tout le tableau confondrait l’insertion avec la sélection.

Exercice 5 · Approfondir et transférer#

Compter une insertion à trois comparaisons

Le tableau est [1,4,6,3]. Décrivez les états temporaires de la dernière insertion, sa position finale et le nombre de comparaisons de valeurs de cette insertion seulement.

Indice 1

La sauvegarde vaut 3 pendant les copies.

Indice 2

La comparaison finale avec 1 est comptée même sans décalage.

Comprendre la correction

Les états temporaires sont [1,4,6,6] puis [1,4,4,6]. La sauvegarde 3 est écrite à l’indice 1, donnant [1,3,4,6]. On compare 6, 4 puis 1 à 3 : trois comparaisons et deux décalages. Les insertions précédentes ne sont pas incluses dans ce compteur.

Exercice 6 · Approfondir et transférer#

Les deux extrêmes du coût

Comparez le tri complet de [1,2,3,4,5] et [5,4,3,2,1]. Donnez décalages et comparaisons de valeurs selon le code du cours. Pourquoi le nombre d’insertions reste-t-il le même ?

Indice 1

Il y a quatre valeurs à insérer dans chaque tableau.

Indice 2

Dans la version décroissante, chaque insertion remonte jusqu’à l’indice 0.

Comprendre la correction

Le tableau croissant demande quatre comparaisons et zéro décalage. Le décroissant demande 1+2+3+4=10 comparaisons et dix décalages : chaque comparaison entraîne une copie, puis le test d’indice arrête la remontée. Il y a quatre insertions dans les deux cas, mais leur travail interne diffère.

Exercice 7 · Approfondir et transférer#

Comparer insertion et sélection

Sur [3,5,1,4], donnez l’état après le premier passage de sélection et après la première insertion. Dans chaque cas, expliquez ce qui est garanti sur le préfixe et ce qui reste à faire.

Indice 1

La sélection cherche le minimum du tableau entier au premier passage.

Indice 2

L’insertion ne considère d’abord que les deux premières valeurs.

Comprendre la correction

La sélection donne [1,5,3,4] : 1 est définitivement la plus petite valeur. L’insertion laisse [3,5,1,4] : le préfixe 3,5 est trié mais 1 reste à traiter. La sélection garantit les plus petites valeurs en place ; l’insertion garantit seulement l’ordre des valeurs déjà rencontrées.

Les erreurs qui méritent un détour

Placer la sauvegarde en t[j] au lieu de t[j + 1].
La boucle s’arrête sur la case précédente ou j = -1. L’emplacement libre se trouve une case plus loin.
Oublier la conservation des valeurs dans la preuve.
Des copies temporaires existent pendant les décalages. La variable sauvegardée permet de reconstituer le préfixe sans perte.

La fiche à garder

L’essentiel à retenir

  • On sauvegarde, on décale, puis on insère.
  • Le préfixe trié contient les valeurs déjà rencontrées.
  • Le pire cas est quadratique, le meilleur linéaire.

Cette notion au bac

Retrouvez ces idées dans un sujet complet, avec des indices, une correction expliquée et des ateliers.

Le prochain pas

Retrouver le catalogue de Première

Ce chapitre s’appuie sur le programme officiel de Première (PDF, nouvel onglet). Les explications et exercices sont proposés pour l’apprentissage.