Tri par sélection
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
Initialement, la première partie est vide. Afin de la faire grossir, on va chercher dans la partie non triée la valeur la plus petite.
Une fois trouvée, elle est échangée avec la première valeur de la partie non triée, et la zone de la parte triée est étendue jusqu'à cette nouvelle valeur.
Une animation en ligne permet également de visualiser l'algorithme. Bien sélectionner « SEL » en haut.
Méthode : Programmation en Python
Pour réaliser le tri par sélection en Python, il faut séparer les étapes en fonctions pour simplifier le programme final :
Une première fonction
echange(l, i, j)
permet d'échanger de place deux valeurs d'indicesi
etj
dans la listel
.Exemple : Si
l = [1, 6, 4, 2]
, alorsechange(l, 1, 2)
modifiel
, et si onprint(l)
on a comme affichage[1, 4, 6, 2]
.
def echange(l, i, j):
# Enregistrer dans une variable la valeur de l[i]
valeur_i = l[i]
# Enregistrer dans une variable la valeur de l[j]
valeur_j = l[j]
# Affecter dans l[i] la valeur de l[j] depuis la variable
l[i] = valeur_j
# Affecter dans l[j] la valeur de l[i] depuis la variable
l[j] = valeur_i
l = [1, 2, 3, 4]
echange(l, 2, 1)
print(l) # [1, 3, 2, 4]
Une deuxième fonction
indice_min(l, debut)
renvoie l'indice de la valeur minimale dansl
à partir de l'indicedebut
.Exemple : Si
l = [1, 6, 4, 2]
, alorsindice_min(l, 1)
regarde la valeur minimale à partir de l'indice 1 (valeur 6) et trouve 2 comme valeur minimale. La fonction renvoie donc 3 (l'indice de la valeur 2).
def indice_min(l, debut):
# Sauvegarder dans deux variables (qui serviront à
# stocker la valeur minimale et son indice) les valeurs
# initiales l[debut] et debut respectivement.
valeur_minimale = l[debut]
indice_minimal = debut
# Parcourir toutes les valeurs de l[debut] à la fin de l
for i in range(debut, len(l)):
# Si la valeur courante est plus petite que la
# valeur minimale enregistrée, mettre à jour la
# valeur et son indice.
if l[i] < valeur_minimale:
valeur_minimale = l[i]
indice_minimal = i
# Renvoyer l'indice de la valeur minimale
return indice_minimal
print(indice_min([4, 7, 3, 2], 1)) # 3
La fonction principale
tri_selection(l)
qui trie la listel
.
def tri_selection(l):
# Tri par sélection de l (voir cours)
for i in range(len(l)):
indice = indice_min(l, i)
echange(l, i, indice)
l = [4, 7, 9, 8, 2, 4, 1, 7]
tri_selection(l)
print(l) # [1, 2, 4, 4, 7, 7, 8, 9]