le Tri par Insertion avec Python : Implémentation et Visualisation

le Tri par Insertion avec Python

Parmi les différentes méthodes de tri existantes, le Tri par Insertion se distingue par sa simplicité. Cette technique, qui imite la manière dont vous pourriez trier des cartes dans vos mains, consiste à prendre un élément de la liste et à l’insérer à sa position correcte parmi les éléments déjà triés. Ce processus est répété pour chaque élément jusqu’à ce que la liste entière soit ordonnée.

Implémentation du Tri par Insertion en Python

# Définition de la fonction de tri par insertion
def tri_insertion(liste):
    # Parcourir chaque élément de la liste à partir du deuxième élément
    for i in range(1, len(liste)):
        # La clé est l'élément courant à insérer dans la partie triée de la liste
        cle = liste[i]
        # Commencer à comparer avec l'élément juste avant la clé
        j = i-1

        # Déplacer les éléments de liste[0..i-1] qui sont plus grands que la clé
        # à une position en avant de leur position actuelle
        while j >= 0 and cle < liste[j]:
            liste[j + 1] = liste[j]  # Déplacer l'élément vers la droite
            j -= 1  # Passer à l'élément précédent dans la partie triée
            
        # Insérer la clé à sa position correcte
        liste[j + 1] = cle

    # Retourner la liste triée
    return liste

# Liste d'exemple à trier
liste_exemple = [22, 27, 16, 2, 18, 6]

# Afficher la liste avant le tri
print("Liste avant le tri:", liste_exemple)

# Appliquer le tri par insertion à la liste d'exemple
liste_triee = tri_insertion(liste_exemple)

# Afficher la liste après le tri
print("Liste après le tri:", liste_triee)

Explication du Code

  1. Initialisation de la Boucle : La boucle for commence à 1 car le premier élément est considéré comme déjà trié.
  2. Sélection de la Clé : La variable cle contient l’élément courant à insérer. On le compare ensuite aux éléments précédents pour trouver sa place correcte.
  3. Trouver la Position Correcte : La boucle while déplace les éléments plus grands que cle d’une position vers la droite pour faire de la place pour cle.
  4. Insertion : Après avoir trouvé la position correcte, cle est insérée.

Visualisation du Tri par Insertion

Pour mieux comprendre le fonctionnement du Tri par Insertion avec Python, rien ne vaut une visualisation concrète de chaque étape de l’algorithme. Le code suivant utilise Matplotlib et numpy pour créer une animation dynamique qui illustre le processus de tri.
Ps : Il faut utiliser Jupyter Notebook pour la visualisation.

from IPython.display import display, clear_output
import matplotlib.pyplot as plt
import numpy as np
import time

def tri_insertion_visual_jupyter(liste):
    fig, ax = plt.subplots()
    n = len(liste)
    
    for i in range(1, n):
        cle = liste[i]
        j = i-1

        # Dessiner l'état actuel de la liste
        ax.clear()  # Effacer le contenu des axes pour le nouveau tracé
        bars = ax.bar(range(n), liste, color='skyblue')
        bars[i].set_color('red')  # Mettre en évidence l'élément à déplacer en rouge
        display(fig)  # Afficher la figure dans la sortie de la cellule
        
        # Déplacer l'élément à sa position correcte
        while j >= 0 and cle < liste[j]:
            liste[j + 1] = liste[j]
            j -= 1
            clear_output(wait=True)
            ax.clear()
            bars = ax.bar(range(n), liste, color='skyblue')
            bars[j+1].set_color('red')  # Continuer à mettre en évidence l'élément déplacé
            display(fig)
            time.sleep(0.5)
        
        liste[j + 1] = cle
        clear_output(wait=True)
        ax.clear()
        bars = ax.bar(range(n), liste, color='skyblue')
        bars[j+1].set_color('green')  # Montrer l'élément inséré en vert
        display(fig)
        time.sleep(0.5)
    
    # Afficher l'état final
    clear_output(wait=True)
    ax.clear()
    ax.bar(range(n), liste, color='lightgreen')
    ax.set_title('État Final Après le Tri')
    display(fig)

# Créer une liste de valeurs aléatoires
liste_a_trier = np.random.randint(1, 100, 15)

# Exécuter la fonction de visualisation
tri_insertion_visual_jupyter(liste_a_trier)

Dans script :

  • À chaque itération de la boucle principale, l’élément à déplacer (cle) est coloré en rouge (bars[i].set_color('red')) pour le mettre en évidence.
  • Pendant que cet élément est déplacé (while loop), il reste en rouge pour indiquer qu’il est l’élément actuellement examiné et potentiellement déplacé.
  • Une fois que cle est insérée à sa position correcte, elle est colorée en vert (bars[j+1].set_color('green')) pour indiquer qu’elle a été correctement placée.
  • clear_output(wait=True) et display(fig) sont utilisés à chaque étape pour rafraîchir l’affichage et créer un effet d’animation fluide.
  • Une pause (time.sleep(0.5)) est ajoutée pour ralentir l’animation, rendant les changements plus faciles à suivre.

Lire aussi :

Le Tri par Sélection avec Python

Le Tri à Bulles avec Python