i+1
à l'indice n-1
i != mini
).pour j de i + 1 à n - 1
: ceci traduit la recherche du minimum dans la suite du tableau à partir de l'élément i, c'est à dire
de i+1
à n-1
.
from random import randint
def tri_selection(L):
n = len(L)
for i in range(0, n):
mini = i
for j in range(i+1, n) : # on parcourt la partie du tableau située APRÈS l'indice i
if L[j] < L[mini] :
mini = j
if mini != i :
temp = L[i]
L[i] = L[mini]
L[mini] = temp
# les trois lignes précédentes peuvent s'écrire aussi L[i], L[mini] = L[mini], L[i]
return L
L = [randint(1,100) for i in range(20)]
print(L)
print(tri_selection(L))
Il n'y a ici pas de "pire cas" ou de "meilleur cas" : dans tous les cas, il faut, pour chacun des éléments, parcourir l'intégralité du reste du tableau :
→ on fait donc en totalité : (n-1) + (n-2) + (n-3) + .... + 0 comparaisons = n(n-1)/2 = (1/2)(n2-n).
Pour de grandes valeurs de n, cette expression tend vers n² : cet algorithme est donc de complexité O(n²) ( = quadratique ).
Un argument plus simple est la présence dans l'algorithme de deux boucles imbriquées :
def tri_insertion(L):
for i in range(1, len(L)):
temp = L[i]
j = i
while j > 0 and L[j-1] > temp:
L[j] = L[j-1]
j = j-1
L[j] = temp # on insère l'élément à sa "bonne" place
return L
Dans le pire des cas, la "bonne place" de chaque élément est le tout début ( indice 0 ) du tableau ( le pire des cas pour cet algorithme est donc un tableau qui est initialement trié dans l'ordre décroissant ).
Dans ce pire des cas, on doit alors faire, pour trouver la "bonne place" de chaque élément :
→ on fait donc en totalité : 1 + 2 + 3 + ... + (n-1) décalages = n(n-1)/2 = (1/2)(n2-n).
Pour de grandes valeurs de n, cette expression tend vers n² : cet algorithme est donc (aussi) de complexité O(n²) ( = quadratique ).
Mais la complexité s'entend dans le pire des cas; or, dans le tri par insertion, on arrête le "parcours à rebours" de la partie triée du tableau dès que l'on a trouvé la place où insérer l'élément courant; la position de cette place n'est pas forcément au tout début de la partie triée, ce qui fait que ce parcours ne concerne parfois qu'un petit nombre d'éléments, surtout si le tableau est d'origine déjà un peu trié : en moyenne, le tri par insertion a donc un coût en temps qui est meilleure que le tri par sélection...
Animation montrant la vitesse d'exécution de différents algorithmes de tri dans différentes situations; on constate que le tri par sélection est systématiquement le moins rapide.
Le tri par insertion est lui plus efficace sur des tableaux presque triés, c'est pourquoi on l'utilise parfois en complément d'autres algorithmes pour "finir le travail" 🙂...