Tri par Fusion en C

Tri par Fusion s’exécute en temps O (n log n). C’est très efficace. Tri par Fusion est un algorithme récursif utilisé pour la fusion qui repose sur la technique Diviser pour Régner. Un tableau d’éléments est divisé en deux sous tableaux plus petits. Une fois ces deux tableaux libérés indépendamment, ils sont en mesure de produire le tableau trié. Le processus de fusion peut être effectué de manière récursive jusqu’à ce qu’il n’y ait qu’un seul élément dans le tableau.
 
 

L’algorithme :
triFusion(tab[], g, d)
Si d > g
   1. Trouvez le milieu pour diviser le tableau en deux moitiés m = (g + d) / 2.
   2. Appelez la méthode triFusion pour la première moitié.
   3. Appelez la méthode triFusion pour la seconde moitié.
   4. Fusionnez les deux moitiés triées aux étapes 2 et 3.
Exemple :


 

Implémentation de l’algorithme de tri par Fusion en C
#include <stdio.h>

void triFusion(int i, int j, int tab[], int tmp[]) {
    if(j <= i){ return;}
	
    int m = (i + j) / 2;
    
    triFusion(i, m, tab, tmp);     //trier la moitié gauche récursivement
    triFusion(m + 1, j, tab, tmp); //trier la moitié droite récursivement

    int pg = i;     //pg pointe au début du sous-tableau de gauche
    int pd = m + 1; //pd pointe au début du sous-tableau de droite
    int c;          //compteur

// on boucle de i à j pour remplir chaque élément du tableau final fusionné
    for(c = i; c <= j; c++) {
        if(pg == m + 1) { //le pointeur du sous-tableau de gauche a atteint la limite
            tmp[c] = tab[pd];
            pd++;
        }else if (pd == j + 1) { //le pointeur du sous-tableau de droite a atteint la limite
            tmp[c] = tab[pg];
            pg++;
        }else if (tab[pg] < tab[pd]) { //le pointeur du sous-tableau de gauche pointe vers un élément plus petit
            tmp[c] = tab[pg];
            pg++;
        }else {  //le pointeur du sous-tableau de droite pointe vers un élément plus petit
            tmp[c] = tab[pd];
            pd++;
        }
    }

    for(c = i; c <= j; c++) {  //copier les éléments de tmp[] à tab[]
        tab[c] = tmp[c];
    }
}


int main() {
  int  nbr, i, tab[100], tmp[100];
 
  printf(" Entrez le nombre d'éléments dans le tableau: ");
  scanf("%d", &nbr);
 
  printf(" Entrez %d entiers : ", nbr);
 
  for (i = 0; i < nbr; i++)
    scanf("%d", &tab[i]);
 
  triFusion(0, nbr-1, tab, tmp);
 
  printf("\n Tableau trié : ");
  for(i = 0; i < nbr; i++)  {
     printf(" %4d", tab[i]);
  }
  printf("\n");
  return 0;
}

La sortie :
 

 
 

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *