C'est le tri du joueur de cartes. On fait comme si les éléments à trier étaient donnés un par un, le premier élément constituant, à lui tout seul, une liste triée de longueur 1. On range ensuite le second élément pour constituer une liste triée de longueur 2, puis on range le troisième élément pour avoir une liste triée de longueur 3 et ainsi de suite...
Le principe du tri par insertion est donc d'insérer à la nième itération le nième élément à la bonne place.
L'animation ci-après illustre le fonctionnement de ce tri :
Dans notre algorithme de tri par insertion, l'invariant de boucle est "Le tableau a[1:i] est trié" :
INITIALISATION : La valeur avant de rentrer dans la boucle est i=1, donc le tableau a[1:1] contient un seul élément. Un tableau contenant un seul élément est forcément trié (trivial), notre invariant "le tableau a[1:i] est trié" est donc vrai.
CONSERVATION : si l'invariant de boucle est vrai avant une itération de la boucle : "Le tableau a[1:i-1] est trié", alors il le reste à la fin de l'itération : "Le tableau a[1:i] est trié".
Si on insère a[i] à sa place dans le tableau a[1:i-1], alors le tableau a[1:i] sera évidemment trié.
TERMINAISON : La dernière valeur prise de i dans la boucle est i=n, donc le tableau a[1:n] sera trié.
Cette démonstration nous permet d'affirmer que l'algorithme de tri par insertion est correct.
Pour évaluer la complexité d'un algorithme il faut envisager le pire des cas, ici lorsque la liste est classée dans l'ordre décroissant.
On suppose que notre liste à n éléments, on va essayer de compter le nombres d'opérations nécessaires pour obtenir la liste triée.
Il y a n-1 boucles :
Donc la complexité est de l'ordre de n2, on dira que le coût est quadratique.
On utilise un algorithme de tri de coût quadratique. Il met 1,6 secondes pour trier un liste de 100 000 nombres.
Quel sera le temps approximativement pour trier 50 000 nombres ?
Solution
On calcule le rapport des nombres d'éléments de chaque liste : pour passer de 100 000 à 50 000 on multiplie par 0,5.
Donc le temps sera multiplié par 0,5² = 0,25. Soit 1,6 × 0,25 = 0,4 seconde.