• Aucun résultat trouvé

Méthode « diviser pour régner » Tri fusion (merge sort)

N/A
N/A
Protected

Academic year: 2022

Partager "Méthode « diviser pour régner » Tri fusion (merge sort)"

Copied!
2
0
0

Texte intégral

(1)

Méthode « diviser pour régner » Tri fusion (merge sort)

1. Principe général du tri fusion

On considère deux listes de nombres triées lst_1 et lst_2 (ou deux collections d’objets comparables triées).

Une fonction fusionne permet de les fusionner en une liste lst également triée.

Pour trier une liste lst par tri fusion, si elle contient un seul élément, elle est déjà triée, sinon on la divise en deux listes que l’on trie par tri fusion avant de les fusionner.

2. Tri fusion d’une file

Nous avons déjà écrit une fonction permettant de fusionner deux files triées en une file triée.

Ouvrir le fichier tri_fusion_file.py reprenant l’implémentation fonctionnelle des files et la fonction fusionne, et écrire la fonction tri_fusion(file).

3. Tri fusion d’une liste Python (ou tableau V1)

Ouvrir le fichier tri_listes_python.py. Revoir rapidement les tris par sélection et insertion.

Programmer le tri fusion d’une liste Python suivant le même principe que le tri d’une file, en écrivant les fonctions fusionne(lst_1, lst_2) et tri_fusion(lst). Dans cette version, la fonction fusionne renvoie une nouvelle liste.

Lancer test_fusionne() puis test_tri_fusion() du fichier runtest_tris.py pour tester vos fonctions.

Lancer les fonctions test_sorts() et compare_tris() pour comparer les différents tris.

Quel est le tri le plus performant ?

4. Tri fusion d’un tableau V2

Une implémentation plus proche du code que l’on trouve en C par exemple, ne crée pas de nouveau tableau à chaque fusion, mais déplace les éléments dans le tableau à trier.

Il existe des implémentations « en place » travaillant uniquement avec le tableau à trier, mais la version la plus simple utilise un tableau temporaire pour effectuer les fusions avant recopie dans le tableau principal.

On note tab[a:b[ le sous-tableau [tab[a], tab[a+1], …, tab[b-1]] du tableau tab.

Écrire la fonction fusionne_tab(tab, deb, n, fin, tab_temp) qui fusionne les sous-tableaux triés tab[deb:n+1[

et tab[n+1:fin+1[ et stocke le tableau résultant dans tab[deb:fin+1[. Le tableau tab_temp permet de stocker les valeurs de la liste fusionnée lors de sa construction, avant recopie dans le tableau tab.

Tester votre fonction en lançant test_fusionne_tab().

Écrire la fonction tri_fusion_(tab, deb, fin), intérieure à tri_fusion_tab(tab).

Lancer test_tri_fusion_tab() pour tester votre code.

Lancer la fonction compare_tris_fusion() pour comparer les deux versions du tri fusion.

(2)

5. Complexité du tri fusion

Soit n la longueur de la liste à trier.

On compte le nombre de comparaisons. Les comparaisons s’effectuent lors des fusions.

Chaque niveau de fusions réalise entre n/2 et n comparaisons, et la profondeur des appels est de l’ordre de log2 n. En effet, la longueur des listes après le k-ième niveau de fusions est de 2k, donc on atteint une longueur n pour 2𝑘𝑘 ≥ 𝑛𝑛⇔𝑘𝑘 ≥ log2𝑛𝑛.

La complexité du tri fusion est donc en Θ(n log2 n) (dans le pire des cas, le meilleur des cas et en moyenne).

Remarque : certaines implémentations effectuent à chaque division des recopies de liste, d’autres pas. Même s’il est préférable de les éviter, cela ne change pas l’ordre de complexité.

6. Preuve de correction à terminer (pour les plus vaillants) Récurrence sur la longueur n de la liste lst à trier.

Initialisation : si len(lst) ≤ 1, alors tri_fusion(lst) renvoie la liste lst qui est déjà triée.

Hérédité : supposons que tri_fusion trie toutes les listes de longueur inférieure ou égale à n (avec n ≥ 1) et considérons une liste de longueur n + 1.

tri_fusion(lst) découpe la liste en deux listes de longueur inférieure ou égale à n qui vont donc être triée par l’appel de tri_fusion, d’après l’hypothèse de récurrence.

Il reste à détailler la preuve que la fonction fusionne fusionne bien deux listes triées en une liste triée.

On prend comme invariant de boucle : « Après la i-ième exécution de la boucle while, la liste lst est la liste triée des i plus petits éléments des listes lst1 et lst2 combinées. »

On le prouve par récurrence sur i … Rédaction à terminer …

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

De plus, si, pour fE, x est pris dans fA, il en est de même pour fG; et si, pour fE, x est pris dans l'un des deux fichiers fB ou fC, alors pour fG, x est pris dans fF, dont il

L’après midi, Paul DEFFONTAINE, président du Cercle National du Recyclage et Vice-président de Lille Mé- tropole Communauté urbaine, animera les débats consacrés aux avancées

[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

L’intérêt de choisir n puissance de 2 est qu’on aura à chaque étape un nombre pair de monotonies à fusionner, et que les monotonies d’une étape donnée auront toutes la

Postconditions : Les monotonies de nomFicX sont réparties (1 sur 2) dans des fichiers appelés nomFicA et nomFicB : la première monotonie est copiée dans le fichier A,