• Aucun résultat trouvé

Tri fusion (mergesort)

N/A
N/A
Protected

Academic year: 2022

Partager "Tri fusion (mergesort)"

Copied!
4
0
0

Texte intégral

(1)

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

(2)

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

(3)

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

(4)

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

Références

Documents relatifs

Lorsqu’une base de données est très volumineuse et non ordonnée, trouver une information dans cette base est très long et très ingrat.. En effet la seule solution est

Dans le tri rapide, après les 2 tris partiels, tous les éléments de la partie gauche sont inférieurs au pivot, alors que tous les éléments de la partie droite... naturelle, et

Or pour que l’élément de rang i et l’élément de rang j soient comparés il faut que le pivot ne soit jamais choisi entre l’élément de rang i et de rang j avant le choix de i ou

On construit alors deux « sous-tableaux » : l'un contient toutes les valeurs du premier tableau qui sont inférieures ou égales au pivot, l'autre contient les valeurs supérieures

Si a^ et b^ sont deux ´el´ements diff´erents du mˆeme anneau, alors le r´esultat de la fonction est le nombre minimum de ^.suiv ` a faire ` a partir de a pour atteindre b.

[r]

Chaque comparaison générant deux possibilités, k comparaisons permettront de génerer au plus 2 k permutations distinctes.. • Le tri shell avec la suite

[r]