Tri fusion (mergesort)
1 Principe
Couper le tableau en son milieu, trier récursivement les deux moitiés, puis fusionner les deux en une liste unique triée.
Il s'agit d'un tri 'rapide', comme 'quicksort', et comme le tri par tas : nombre de comparaisons
C(n) =O(n.lnn)
1
import random as rd n = 10
t = [rd.randint(0, 2*n) for k in range(n)]
print('t : ', t)
# Le tri fusion trie indépendamment
# et récursivement les deux moitiés
# de t et les fusionne.
def tri(t):
n = len(t) if n > 1:
t1 = tri(t[: n//2]) t2 = tri(t[n//2 :]) fusion(t1, t2, t) return t
def fusion(t1, t2, t):
n1, n2 = len(t1), len(t2) ind1, ind2 = 0, 0
t[:] = []
while ind1 < n1 and ind2 < n2:
if t1[ind1] < t2[ind2]:
t.append(t1[ind1]) ind1 += 1
else:
t.append(t2[ind2]) ind2 += 1
t += t1[ind1 :]
t += t2[ind2 :]
tri(t)
print('r : ', t)
# Que se passe-t-il si on remplace la ligne
# 21 par t = [] ?
1
2 Complexité
2.1 Nombre de comparaisons
Nombre de comparaisons eectuées entre éléments de la liste au cours de la
fusion : jn
2
k≤F(n)≤n−1
2.2 Cas particulier
Supposons pour simplier,n= 2q.
SoitC(n)le nombre maximum de comparaisons eectuées entre éléments de la liste.
C(n) =n−1 + 2.Cn 2
Par récurrence surq: C(2q) = (q−1).2q+ 1. On retient que dans ce cas
C(n)∼n.log2(n)
2.3 Dans le cas général
Il existe un entierqtel que2q−1< n≤2q ; il sut de prendre q=dlog2(n)e
D'où : C(n)≤C(2q)≤q.2q. En résumé
C(n) =O(n.logn)
2.4 Cas favorable
C'est le cas où la liste est déjà triée : environ deux fois moins de comparaisons que dans le pire des cas.
C(2q) = 2q−1+ 2.C 2q−1 Ce qui conduit à
C(2q) =q.2q−1 Dans ce cas
C(n)∼1
2.n.log2(n)
2.5 Conclusion
Le tri fusion fait partie des tris rapides.
- Il est globalement moins rapide que 'quicksort'.
- Il nécessite des recopies, donc plus de mémoire que 'quicksort'.
- Mais il n'a pas l'inconvénient du pire des cas enn2 : ici, même dans le pire des cas
C(n) =O(n.logn)
- Dans le cas d'une liste déjà triée, c'est le tri par insertion le meilleur : complexité linéaire.
3
3 Application à la recherche de la médiane d'une liste de nombres
3.1 Dénition
La médianemd'un ensemble dennombres distincts est tel qu'il y a autant de nombres plus petits quemque de nombres plus grands quem, à un près
; sinest pair, il y a deux médianes.
3.2 Déterminer la médiane
Il sut de trier la listeL, puis ? n = len(L)
L[n//2]
La complexité est enn.lognsi on utilise le tri fusion.
3.3 Algorithmes linéaires
On verra en exercice un algorithme linéaire en moyenne, et un algorithme linéaire dans le pire des cas.
4