Académique Documents
Professionnel Documents
Culture Documents
t ris
ISN_tri_python
L'algorithme principal du tri par insertion est un algorithme qui insère un élément dans une liste
d'éléments déjà triés (par exemple, par ordre croissant).
Imaginez un joueur de cartes qui dispose de cartes numérotées. Il a des cartes triées de la plus petite à
la plus grande dans sa main gauche, et une carte dans la main droite. Où placer cette carte dans la
main gauche de façon à ce qu'elle reste triée ? Il faut la placer après les cartes plus petites, et avant les
cartes plus grandes.
Par exemple, si la main gauche est (1 3 6 8), et que j'ai la carte 5 dans la main droite, il faut la placer
après (1 3) et avant (6 8). Si l'on fait ça, on se retrouve avec la main gauche (1 3 5 6 8), qui est encore
triée.
1.3 INSERER UN ELEMENT DANS LA MAIN GAUCHE
Commençons tout d’abord par l’opération d’insertion d’une carte de la main droite vers la main
gauche. On veut placer la carte après toutes les cartes plus petites, et avant toutes les cartes plus
grandes.
En reprenant notre exemple de tout à l'heure, pour insérer l'élément 5 dans la main (1 3 6 8), voici ce
qu'on veut faire :
Pour faire cela, une bonne méthode est de commencer par la droite : on décale la carte la plus à droite
(8), puis celle juste à gauche (6), jusqu'au moment où on tombe sur une carte plus petite que celle
qu'on veut insérer, qu'il ne faut pas décaler. Une fois qu'on a fait ces décalages, on peut insérer la
carte, à la position à laquelle on s'est arrêté de décaler.
Pour trier entièrement un ensemble de cartes dans le désordre, il suffit alors de placer toutes ses
cartes dans la main droite (la main gauche est donc vide), et d'insérer les cartes une à une dans la main
gauche, en suivant la procédure ci-dessus.
Pour coder cet algorithme, Je prends 2 listes. Le premier étant ma liste « listd » en désordre (la main
droite dans mon exemple) le second « listg » vide au départ.
Admettons que je sois à l’étape « i » de mon tri. Je dois donc insérer la case listd[i] dans le tableau listg
qui contient déjà les i-1 premiers éléments de tabd trié.
Comment coder cela en Python ? Indication, on a une methode list.insert (position,élément) qui insert
l’ « élément » dans la list à la « position ».
Il ne reste plus qu’a faire une boucle for avec i in range (la longueur de ma liste) et insérer chaque
élément listd[i] dans la listg. On pourrait faire, pour plus de clarté, une première fonction qui prend en
argument un nombre et une liste (supposée triée) et insert ce nombre à la bonne place dans la liste.
pour swaper :
l[4],l[5] = l[5],l[4]
Faire une première fonction indice_max qui prend en argument une liste et un entier n et qui renvoi la
position du plus grand élément de cette liste dans les n premiers termes (attention, pas la valeur de
l’élément mais bien sa position).
Une fois ceci fait, on fait une boucle for « à rebour » avec i allant de la longueur de la liste jusqu'à 1,
On chercher l’indice max dans la liste des i premiers élément avec notre fonction et on échange les deux
éléments en position i et indice_max. Les échanges dans la liste peuvent être fait avec une double
affectation simultanée en python de type a,b=b,a qui a le mérite de ne pas utiliser de « variable de
sauvegarde »
L'algorithme parcourt le tableau, et compare les couples d'éléments successifs. Lorsque deux éléments
successifs ne sont pas dans l'ordre croissant, ils sont échangés. Après chaque parcours complet du
tableau, l'algorithme recommence l'opération. Lorsqu'aucun échange n'a lieu pendant un parcours,
cela signifie que le tableau est trié. On arrête alors l'algorithme.
Première étape:
(51428) ( 1 5 4 2 8 ) Les éléments 5 et 1 sont comparés, et comme 5 > 1, l'algorithme les
intervertit.
(15428) ( 1 4 5 2 8 ) Interversion car 5 > 4.
(14528) ( 1 4 2 5 8 ) Interversion car 5 > 2.
(14258) ( 1 4 2 5 8 ) Comme 5 < 8, les éléments ne sont pas échangés.
Deuxième étape:
ISN| Y. PAILLOT | Lycée Louis Massinon – Abu Dhabi 3
(14258) ( 1 4 2 5 8 ) Même principe qu'à l'étape 1.
(14258) (12458)
(12458) (12458)
Il n’est pas nécessaire de comparer 5 et 8 ca on est assuré d’avoir après la première étape, le plus
grand nombre au en bout de tableau.
À ce stade, la liste est triée, mais pour le détecter, l'algorithme doit effectuer un dernier parcours.
Troisième étape:
(12458) (12458)
(12458) (12458)
Comme la liste est triée, aucune interversion n'a lieu à cette étape, ce qui provoque l'arrêt de
l'algorithme.
Coder le tri par bulle. On pourra au départ coder une version simple qui parcours intégralement le
tableau pour faire l’inversion nécessaire, puis on pourra optimiser en rajoutant un compteur « j » qui
compte le nombre d’étapes effectuée et arrête les comparaisons en s’arrêtant à « j » cases de la fin
(puisqu’on est assuré d’avoir les j plus grands éléments triés en fin de tableau après j étapes).