Tri par insertion
Le tri par insertion, comme le tri par sélection, consiste à découper la liste en deux parties :
Une partie triée située en début de liste
Une partie non triée située en fin de liste
Le changement majeur est qu'au lieu de chercher la valeur minimale dans la partie non triée, on va récupérer la première valeur qu'on va insérer dans la première partie (en respectant l'ordre croissant).
Une animation en ligne permet également de visualiser l'algorithme. Bien sélectionner « INS » en haut.
Méthode : Programmation en Python
Pour réaliser le tri par insertion en Python, il faut séparer les étapes en fonctions pour simplifier le programme final :
Une première fonction
deplacer(l, dest, source)
permet d'insérer dans la listel
à la positionsource
la valeur d'indicedest
tout en supprimant l'ancienne valeur.Exemple : Si
l = [8, 3, 9, 5, 2]
, alorsdeplacer(l, 1, 3)
modifiel
, et si onprint(l)
on a comme affichage[8, 5, 3, 9, 2]
.
def deplacer(l, dest, source):
valeur = l[source]
l.pop(source)
l.insert(dest, valeur)
Une deuxième fonction
position_tri(l, fin, valeur)
renvoie l'indice où la valeurvaleur
doit être insérée dans la listel
de telle sorte que la sous-liste de l'indice0
à l'indicefin
exclu soit toujours triée après insertion de la valeur.Exemple : Si
l = [1, 5, 6, 8, 3, 2]
, alorsposition_tri(l, 4, 3)
regarde où palcer la valeur 3 dans la sous-liste[1, 5, 6, 8]
. On peut insérer 3 à l'indice 1 ce qui donnerait[1, 3, 5, 6, 8]
qui est toujours triée. La fonction renvoie donc1
sans modifier la liste.
def position_tri(l, fin, valeur):
for i in range(fin):
if valeur < l[i]:
return i
return fin
La fonction principale
tri_insertion(l)
qui trie la listel
.
def tri_insertion(l):
for i in range(len(l)):
print(l)
indice = position_tri(l, i, l[i])
deplacer(l, indice, i)