from random import randint
L = [randint(1,100) for i in range(20)]
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
print(L)
print(tri_selection(L))
i+1
à l'indice n-1
i != mini
).pour j de i + 1 à n - 1
. t[j]
et t[mini]
avec mini = i
initialement.)
Pour de grandes valeurs de n, cette expression tend vers n²; cet algorithme est donc de complexité O(n²).
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 place
return L
Dans le pire des cas, le raisonnement est exactement le même que pour le tri par sélection ( présence de deux boucles imbriquées ).
On peut cependant noter que dans le cas du tri par sélection, on recherche systématiquement le minimum dans le reste du tableau non trié, que l'on est donc obligé de parcourir.
Par contre, dans le tri par sélection, 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 : en moyenne, le tri par insertion a donc un coût en temps
qui est meilleure que le tri par sélection...
Cela se ressent dans la durée d'exécution du chaque script sur le même tableau non trié. Ceci illustre d'ailleurs le fait qu'il ne faut pas confondre complexité d'un algorithme et temps d'exécution du programme qui l'implémente : ces deux algorithmes sont de complexité O(n²), mais le tri par insertion est quand même souvent plus rapide...