i+1 à l'indice n-1i != 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, cet algorithme est donc (aussi) de complexité O(n²) ( = quadratique ).
Comparaison avec le tri sélection
1. t = [9, 8, 7, 6, 5, 4, 3, 2, 1]
- sélection : 36
- insertion : 36
2. t = [1, 2, 3, 9, 8, 7, 6, 5, 4]
- sélection : 36
- insertion : 23
3. t = [1, 2, 4, 3, 5, 7, 6, 8, 9]
- sélection : 36
- insertion : 10
4. t = [1, 2, 3, 4, 5, 6, 7, 8, 9]
- sélection : 36
- insertion : 8
Conclusion :