Le Tri par Sélection est une méthode classique et intuitive de tri d’éléments dans un ordre spécifique. Cette méthode est souvent utilisée dans l’enseignement des concepts fondamentaux de l’algorithmique.
Le Tri par Sélection procède en identifiant le plus petit élément de la liste et en le plaçant en première position. Cette opération est répétée pour la portion restante de la liste, plaçant à chaque fois le minimum suivant à la position correcte. Concrètement, l’algorithme divise la liste en deux parties : une sous-liste triée au début et une sous-liste non triée. À chaque itération, il recherche le minimum dans la sous-liste non triée et l’échange avec l’élément à la première position de cette sous-liste.
Implémentation
Voici un exemple simple d’une implémentation avec Python :
# Définition de la fonction qui implémente l'algorithme de Tri par Sélection
def tri_selection(liste):
# Parcourir tous les éléments de la liste
for i in range(len(liste)):
# Initialiser l'indice du minimum à la position actuelle
min_index = i
# Parcourir les éléments non triés
for j in range(i+1, len(liste)):
# Si l'élément actuel est inférieur à l'élément min actuel, mettre à jour min_index
if liste[min_index] > liste[j]:
min_index = j
# Après avoir trouvé le minimum, échanger avec l'élément à la position i
liste[i], liste[min_index] = liste[min_index], liste[i]
# Retourner la liste triée
return liste
# Liste des nombres qui doivent être triés
liste_a_trier = [64, 34, 25, 12, 22, 11, 90]
# Appeler la fonction tri_selection avec la liste à trier comme argument
liste_triee = tri_selection(liste_a_trier)
# Imprimer la liste triée pour vérifier le résultat
print("Liste triée :", liste_triee)
Explication Détaillée de Chaque Étape du Code
- Initialisation de la Boucle : La boucle externe parcourt chaque élément de la liste.
i
représente l’indice du premier élément de la sous-liste non triée. - Recherche du Minimum : À l’intérieur de la boucle externe, une boucle interne cherche l’indice du plus petit élément (
min_index
) dans la sous-liste non triée, en commençant pari+1
jusqu’à la fin de la liste. - Échange des Éléments : Après avoir identifié l’indice du minimum dans la sous-liste, cet élément est échangé avec l’élément à la position
i
, plaçant ainsi le plus petit élément trouvé à sa position finale dans la sous-liste triée. - Répétition : Ce processus est répété pour chaque élément de la liste, en réduisant progressivement la taille de la sous-liste non triée.
Section 5 : Visualisation du Tri par Sélection avec Jupyter Notebook
Pour visualiser le Tri par Sélection, nous pouvons utiliser les bibliothèque Matplotlib et numpy (il faut utiliser Jupyter Notebook pour la visualisation). Voici un exemple de code qui illustre comment cela peut être réalisé :
# Importe la bibliothèque de visualisation Matplotlib
import matplotlib.pyplot as plt
import numpy as np
# Importe des fonctions pour l'affichage interactif dans Jupyter
from IPython.display import display, clear_output
import time
# Définit la fonction de visualisation du Tri par Sélection
def visualiser_tri_selection(liste):
n = len(liste) # Détermine la longueur de la liste à trier
fig, ax = plt.subplots() # Crée une nouvelle figure et des axes pour le graphique
rects = ax.bar(range(n), liste, color='skyblue') # Dessine un diagramme en barres de la liste avec une couleur initiale
ax.set_title('Tri par Sélection en Action') # Définit le titre du graphique
# Boucle principale du Tri par Sélection
for i in range(n):
min_idx = i # Initialise l'indice du minimum à l'élément courant
# Boucle pour trouver l'indice du minimum dans la sous-liste non triée
for j in range(i+1, n):
if liste[j] < liste[min_idx]:
min_idx = j # Met à jour l'indice du minimum si un élément plus petit est trouvé
# Met à jour les couleurs des barres pour la visualisation
for rect in rects:
rect.set_color('skyblue') # Réinitialise la couleur de toutes les barres
rects[min_idx].set_color('red') # Colore la barre du minimum actuel en rouge
rects[i].set_color('yellow') # Colore la barre à la position i en jaune
# Échange le minimum trouvé avec l'élément à la position i
liste[i], liste[min_idx] = liste[min_idx], liste[i]
# Met à jour les hauteurs des barres pour refléter l'état actuel de la liste après l'échange
for rect, h in zip(rects, liste):
rect.set_height(h) # Met à jour la hauteur de chaque barre
clear_output(wait=True) # Efface la sortie précédente pour éviter l'encombrement
display(fig) # Affiche le graphique mis à jour
time.sleep(0.5) # Introduit un délai pour rendre l'animation visible
# Colore toutes les barres en vert une fois le tri terminé pour indiquer la liste complètement triée
for rect in rects:
rect.set_color('green')
clear_output(wait=True) # Efface la sortie précédente
display(fig) # Affiche le graphique final
# Crée une liste de nombres aléatoires à trier
liste_a_trier = np.random.randint(1, 100, 20)
visualiser_tri_selection(liste_a_trier) # Appelle la fonction de visualisation avec la liste générée
À chaque étape de l’algorithme, les éléments minimum et courant sont mis en évidence avec des couleurs différentes, et les hauteurs des barres sont mises à jour pour refléter les échanges effectués.
Lire aussi :
Le Tri à Bulles en Python : Guide Étape par Étape