Algorithmes de tri

Tri par fusion

Le tri par fusion procède comme suit:

Mise en application du tri par fusion sur une liste d'entiers

Cette méthode de tri, basée sur la technique diviser pour régner, découpe récursivement la liste à trier en deux sous-listes. Si une sous-liste est vide ou possède un seul élément, elle est triée par définition. Sinon, la sous-liste est découpée en deux. Une fois les deux sous-listes triées, l'opération principale de l'algorithme, nommée la fusion, consiste à réunir les sous-listes triées en une seule. Cette fusion se fait selon l'observation suivante: le plus petit élément de la nouvelle liste à construire est soit le plus petit élément de la première sous-liste, soit le plus petit élément de la deuxième sous-liste. Ainsi, on peut construire la nouvelle liste élément par élément en retirant tantôt le premier élément de la première sous-liste, tantôt le premier élément de la deuxième sous-liste après les avoir comparés. Une fois l'une des sous-listes vide, il suffit d'ajouter le reste de l'autre sous-liste en queue de la nouvelle liste. La figure suivante illustre cet algorithme:

algo4.png

Déroulement du tri par fusion sur une liste d'entiers

Le découpage de la liste à trier nécessite de la mémoire supplémentaire mais la complexité de cet algorithme est nettement meilleure que celle des algorithmes précédents en terme de comparaisons réalisées.

A vous de jouer !

En vous basant sur les exemples présentés ci-dessus, répondez à chacun des points suivants:

  1. En guise d'exploration préliminaire de l'algorithme, utilisez la visualisation proposée sur opendsa-server.cs.vt.edu en lui appliquant la liste [3, 4, 6, 2, 5, 1, 8, 7] ci-dessus.
  2. Décrivez à la main chacune des étapes de progression du tri par fusion appliqué à la liste [91, 17, 2, 35, 54]. Au besoin, recourez au lien ci-dessus ou au programme TestFusion vous permettant de valider votre réponse.
  3. Implémentez le tri par fusion en Python en vous basant sur le squelette téléchargeable ici. Corrigez ensuite votre code à l'aide de la solution proposée ci-dessous.
  4. En vous basant sur la solution de l'implémentation réalisée précédemment, décrivez la suite d'appels récursifs générés par l'appel TriFusion([3, 4, 2, 1]).
  5. Pour chacune des listes suivantes, calculez le nombre de comparaisons d'éléments nécessaires à son tri selon l'implémentation proposée précédemment.
    1. croissante = [1, 2, 3, 4, 5, 6, 7, 8]
    2. decroissante = [8, 7, 6, 5, 4, 3, 2, 1]
    3. aleatoire = [54, 26, 93, 31, 77, 17, 44, 55]
  6. Déterminez le nombre de comparaisons nécessaires pour fusionner une liste triée de longueur n avec une liste triée de longueur m dans le meilleur et dans le pire des cas.
  7. Calculez le nombre de comparaisons d'éléments nécessaires au tri de listes comportant 32, 128 puis n éléments. Au besoin, recourez au programme AnalyseComplexite vous permettant de valider vos réponses.

|