Le tri à bulles et le tri fusion
Le tri à bulles
Le tri à bulles doit son nom au fait que les plus grandes valeurs « remontent » progressivement vers la fin du tableau, comme des bulles qui remontent à la surface. Le principe est simple : tu parcours le tableau et tu compares chaque paire d'éléments voisins ; s'ils sont dans le mauvais ordre, tu les échanges. Tu répètes ce parcours jusqu'à ce que plus aucun échange ne soit nécessaire.
À chaque passage complet, le plus grand élément restant remonte forcément jusqu'à sa position finale, à droite. C'est pour cela qu'on peut réduire la zone à parcourir d'un cran à chaque passage.
depart : [5, 2, 4, 1, 3]
passe 0 : [2, 4, 1, 3, 5] (5 remonte tout a droite)
passe 1 : [2, 1, 3, 4, 5] (4 se place juste avant 5)
passe 2 : [1, 2, 3, 4, 5] (3 se place juste avant 4)
passe 3 : [1, 2, 3, 4, 5] (aucun echange -> tableau deja trie, on arrete)
La complexité est en O(n²) dans le pire cas (tableau trié à l'envers) car chaque passage compare presque tout le tableau, et il faut presque n passages. Mais avec un petit drapeau (« a-t-on fait un échange ? »), le tri à bulles devient O(n) dans le meilleur cas : si aucun échange n'a lieu lors d'un passage, le tableau est déjà trié et on peut s'arrêter immédiatement.
def tri_bulles(a):
a = a[:]
n = len(a)
for i in range(n - 1):
echange = False
for j in range(n - 1 - i):
if a[j] > a[j + 1]:
a[j], a[j + 1] = a[j + 1], a[j]
echange = True
if not echange:
break
return a
Piège classique : oublier de réduire la borne n - 1 - i (on ne doit pas revérifier la partie déjà triée à droite), et oublier le drapeau echange, qui rend l'algorithme bien plus lent sur des tableaux presque triés.

