A[3] = cle = 6
Maintenant, on veut démontrer l’exactitude de cet algorithme en général. Il faut donc
choisir un bon invariant de boucle qui nous aidera à démontrer l’exactitude.
Alors, soit l’invariant suivant : « A[1..i-1] est trié » .
Initialisation : Au début de l’exécution de l’algorithme de tri par insertion, et lorsque i = 2,
le sous-tableau A[1..i-1] contient un seul élément A[1]. Alors, cet évident qu’un tableau
d’un seul élément est trié.
Maintenance : Supposons qu’avant l’exécution de l’itération pour i que l’invariant était
valide (A[1..i-1] est trié). On veut montrer qu’à la fin d’exécution de cette itération, et
lorsque i s’incrémente, l’invariant restera toujours valide ;i .e. A[1..i] est trié.
On a donc A[1..i-1] trié avant l’exécution de la boucle interne. Il faut ici
démontrer qu’après l’exécution de la boucle interne que le nouveau sous-tableau A[1..i]
est trié. On peut facilement fixer un deuxième invariant pour la boucle interne comme suit :
« A[1..j] est trié
ET A[j+1..i] est trié
ET tous les éléments du A[j+1..i]sont supérieurs ou égale à cle»
(il reste comme exercice à domicile)
Terminaison : A la fin d’exécution de l’algorithme, l’invariant reste toujours valide
( A[1..i-1] est trié). On sait aussi que la valeur de i pour qu’on puisse sortir de la boucle
doit être égale à n+1. Alors, à la fin d’exécution on a A[1..n]trié.