Vous êtes sur la page 1sur 3

Informatique

Cours 4.3

Tri fusion

1 Principe du tri fusion


La mthode de tri fusion est base sur la division de liste en 2 parties sensiblement gales (algorithme
du type "diviser pour rgner").
- On partage le tableau en deux groupes de taille "gale" (sauf lorsque len(t) est impair) :
t[0 : m] et t[m : len(t)] avec m = (len(t)+0)//2.
- On dcoupe rcursivement chacun des deux groupes dlments,
- lorsque la partition conduit des lments uniques, on fait l'assemblage en sens inverse de la
dcoupe en interclassant les lments de chaque partition,
- par remonte de la rcurrence, on obtient 2 partitions t[0 : m] et t[m : len(t)] tris, on les fusionne
pour obtenir un tableau tri.

0 1 2 3 4 5
5 8 3 2 9
m=5//2=2

0 1 2
5 8
On divise en 2 parties
chaque liste par
rcurrence.

2 3 4 5
3 2 9

m= (5+2)//2 =7//2 =3
2 3
3

3 4 5
2 9

m= (5+3)//2 =8//2 =4
m=2//2=1
0 1
5

1 2
8

3 4
2

4 5
9

3 4 5
2 9
On rassemble chaque
liste en sens inverse en
interclassant les lments
(on assemble donc des
listes tries ou unitaire)

0 1 2
5 8

2 3 4 5
2 3 9

0 1 2 3 4 5
2 3 5 8 9

Lyce Jules Ferry Cannes

Page 1 sur 3

TSI2

Informatique

Cours 4.3

Tri fusion

Algorithmes du tri fusion


2.1 Algorithme de fusion des listes tries

Pour raliser la fusion de deux parties adjacentes dj tries, notes t[g : m] et t[m : d] :
- on utilise un tableau annexe tmp (il est trop difficile de travailler en place ici).
- on parcourt simultanment t[g : m] avec un indice i et t[m : d] avec un indice j et on range leurs
lments au fur et mesure dans tmp l'indice k, dans le bon ordre.
- une fois tmp rempli, on recopie son contenu dans t[g : d] (en crasant les anciennes valeurs)
- la portion t[g : d] est donc trie.
Algorithme fusion (t, g, d)
# Entre : liste trier t, indice de gauche g (entier), indice de droite d (entier)
# Sortie : liste trie entre l'indice gauche et l'indice droit.
tmp liste contenant (d-g) zros
# cration d'un tableau tmp
m (g+d) div 2
# calcul du milieu de la partition
ig
# initialisation de l'indice de la liste gauche
jm
# initialisation de l'indice de la liste droite
Pour k variant de 0 d-g-1 faire
# balayage des lments de tmp
Si i<m et (j=d ou t[i]<t[j]) alors
# si i est puis et (si j est puise ou t[i]<t[j])
tmp[k] t[i]
# placer en lment de la partition gauche dans tmp
i i +1
Sinon
tmp[k] t[j]
# placer en lment de la partition droite dans tmp
j j +1
Fin Si
Fin Pour
t[g:d] tmp[0:d-g]
# remplacer tmp dans t sur la partition trie
Renvoyer t
Fin d'algorithme fusion

2.2 Algorithme de tri


Le tri se fait par un appel rcursif et par fusion des listes partitionnes.
Algorithmes de tri (t, g, d)
# Entre : liste trier t, indice de gauche g (entier), indice de droite d (entier)
# Sortie : liste trie entre l'indice gauche et l'indice droit.
Si g < d-1 Alors
# on partitionne sauf s'il ne reste plus qu'un lment g=d-1
m (g+d) div 2
# calcul du milieu de la partition
tri (t, g ,m)
# tris rcursifs des partitions (stockage ventuel dans des piles)
tri (t, m, d)
fusion (t, g, d)
# fusion des dernires partitions finalises
Renvoyer t
Exemple de rsolution :
>>> t1 =[5,8,3,2,9]
>>> tri(t1, 0, 5)
[2,3,5,8,9]
Remarque :
On renvoie le tableau t en sortie pour que la fonction renvoie quelque chose.
t sera modifie dans tous les cas par les fonctions en python (liste t dans la fonction = alias qui pointe
vers la mme adresse en mmoire que t1 utilis lors de l'appel).
Lyce Jules Ferry Cannes

Page 2 sur 3

TSI2

Informatique

Cours 4.3

Tri fusion

3 Performances de l'algorithme
Complexit
Le cot temporel de lalgorithme de tri est principalement donn par des oprations de comparaison
sur les lments trier.
On raisonne dans la suite sur le nombre de donnes traiter pour lanalyse de la complexit de
lalgorithme.
Soit t un tableau de longueur n. Notons C(n) le nombre de comparaisons ncessaires pour effectuer le
tri fusion de t.
Calculons C(n) :
- on effectue rcursivement les tris fusion de t[0 : m] et t[m : len(n)] : cela demande 2*C(n/2)
comparaisons (si n est pair).
- ensuite, la fusion des deux sous-tableaux demande f (n) comparaisons.
Etudions les deux cas extrmes :
o f (n) = n est le pire cas : tous les lments de chaque portion sont examins (les lments
les plus petits sont alternativement dans chaque portion):
C(n) = n + 2C(n/2) C(n) ~ n log(n):
o f (n) = n/2 est le meilleur cas : seuls les lments dune portion sont examins (sils sont
tous plus petits que ceux de lautre portion) :
C(n) =n/2+ 2C (n/2) C(n) ~ n log(n)/2
Bilan des complexits temporelle du tri rapide
meilleur des cas pire cas
comparaisons n.log(n)/2
n.log(n)
affectations
2.n.log(n)
2.n.log(n)
L'algorithme de tri fusion a donc des performances optimales.
Il n'est dpass que par le tri par insertion, dans le cas d'une liste presque trie, avec une complexit
linaire.

Ressources :
Damien Broizat
Patrick Beynet UPSTILyce Jules Ferry Cannes

Page 3 sur 3

TSI2

Vous aimerez peut-être aussi