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 :


