Dans cet article, nous explorerons en détail l’algorithme de tri par fusion en langage C. Nous examinerons son implémentation, ses applications pratiques et les meilleures pratiques pour optimiser son efficacité.
Le tri par fusion est un algorithme de tri efficace et stable qui utilise la technique de la diviser pour régner. Il divise récursivement la liste à trier en deux moitiés, trie chaque moitié séparément, puis fusionne les moitiés triées pour former une liste entièrement triée. Cet algorithme est efficace pour trier de grandes quantités de données.
Voici une implémentation de l’algorithme de tri par fusion en langage C :
#include <stdio.h>
void fusion(int arr[], int left, int mid, int right) {
int i, j, k;
int n1 = mid - left + 1;
int n2 = right - mid;
// Création de tableaux temporaires
int L[n1], R[n2];
// Copie des données dans les tableaux temporaires L[] et R[]
for (i = 0; i < n1; i++)
L[i] = arr[left + i];
for (j = 0; j < n2; j++)
R[j] = arr[mid + 1 + j];
// Fusion des tableaux temporaires dans arr[left..right]
i = 0;
j = 0;
k = left;
while (i < n1 && j < n2) {
if (L[i] <= R[j]) {
arr[k] = L[i];
i++;
} else {
arr[k] = R[j];
j++;
}
k++;
}
// Copie des éléments restants de L[], s'il y en a
while (i < n1) {
arr[k] = L[i];
i++;
k++;
}
// Copie des éléments restants de R[], s'il y en a
while (j < n2) {
arr[k] = R[j];
j++;
k++;
}
}
void tri_fusion(int arr[], int left, int right) {
if (left < right) {
int mid = left + (right - left) / 2;
// Tri des deux moitiés
tri_fusion(arr, left, mid);
tri_fusion(arr, mid + 1, right);
// Fusion des deux moitiés triées
fusion(arr, left, mid, right);
}
}
int main() {
int arr[] = {12, 11, 13, 5, 6, 7};
int n = sizeof(arr) / sizeof(arr[0]);
printf("Tableau initial :\n");
for (int i = 0; i < n; i++)
printf("%d ", arr[i]);
printf("\n");
tri_fusion(arr, 0, n - 1);
printf("Tableau trié :\n");
for (int i = 0; i < n; i++)
printf("%d ", arr[i]);
printf("\n");
return 0;
}
fusion()
fusionne deux sous-tableaux triés en un tableau trié.tri_fusion()
implémente l’algorithme de tri par fusion en divisant récursivement la liste et en fusionnant les sous-tableaux triés.main()
est utilisée pour tester l’algorithme avec un exemple de tableau non trié.// Exemple de tri des résultats d'une requête SQL par ordre croissant de montant
SELECT * FROM transactions ORDER BY amount ASC;
Le tri par fusion ordonne les résultats de requêtes SQL par critères variés, comme dates, noms ou valeurs.
// Exemple d'utilisation du tri par fusion pour trier les chemins par distance croissante
void trierChemins(Chemin chemins[], int taille) {
tri_fusion(chemins, 0, taille - 1, comparerParDistance);
}
Le tri par fusion dans les algorithmes de recherche de chemins dans les graphes optimise la recherche de chemins optimaux.
// Exemple de tri par fusion pour ordonner les enregistrements dans un fichier de journal par date
void trierFichierJournal(FILE* fichier) {
// Lire les enregistrements du fichier
Enregistrement* enregistrements = lireFichier(fichier);
// Trier les enregistrements par date
tri_fusion(enregistrements, 0, nombreEnregistrements - 1, comparerParDate);
// Écrire les enregistrements triés dans un nouveau fichier ou mettre à jour le fichier existant
ecrireFichierTrié(enregistrements);
// Libérer la mémoire
libererMemoire(enregistrements);
}
Le tri par fusion peut être utilisé dans le traitement de fichiers de données, tels que des fichiers de journaux, pour ordonner les enregistrements par date, heure ou autre critère pertinent.
// Exemple d'utilisation du tri par fusion pour trier les symboles par fréquence avant le codage Huffman
void trierSymbolesParFrequence(Symbole symboles[], int taille) {
tri_fusion(symboles, 0, taille - 1, comparerParFrequence);
}
Le tri par fusion dans la compression de données, comme le codage Huffman, organise les symboles par fréquence pour l’efficacité.
// Exemple d'utilisation du tri par fusion pour trier des échantillons de signal par amplitude croissante
void trierEchantillonsSignal(int echantillons[], int taille) {
tri_fusion(echantillons, 0, taille - 1, comparerParAmplitude);
}
Le tri par fusion organise les échantillons de signal avant la convolution ou la transformation de Fourier.
// Exemple d'utilisation du tri par fusion pour trier les transactions par date dans un système financier
void trierTransactionsParDate(Transaction transactions[], int taille) {
tri_fusion(transactions, 0, taille - 1, comparerParDate);
}
Dans le domaine financier, le tri par fusion peut être utilisé pour trier les transactions financières par date, montant ou autre critère pertinent, facilitant ainsi l’analyse et le traitement des données financières.
Les cas particuliers du tri par fusion en C peuvent inclure des situations où la taille du tableau à trier est très petite, où le tableau est déjà partiellement trié ou inversé, ou encore lorsque des contraintes de mémoire sont présentes. Voici quelques exemples de cas particuliers :
Lorsque la taille du tableau à trier est très petite, le coût supplémentaire de la récursion peut rendre le tri par fusion moins efficace que d’autres algorithmes de tri plus simples, tels que le tri par insertion.
// Exemple de tri par insertion pour un petit tableau
void tri_insertion(int arr[], int n) {
int i, cle, j;
for (i = 1; i < n; i++) {
cle = arr[i];
j = i - 1;
while (j >= 0 && arr[j] > cle) {
arr[j + 1] = arr[j];
j = j - 1;
}
arr[j + 1] = cle;
}
}
Si le tableau est déjà partiellement trié ou inversé, le tri par fusion peut nécessiter moins de comparaisons et de permutations, ce qui peut réduire le temps d’exécution de l’algorithme.
// Exemple de tableau partiellement trié
int arr_partiellement_trie[] = {1, 3, 5, 2, 4, 6};
// Exemple de tableau inversé
int arr_inverse[] = {6, 5, 4, 3, 2, 1};
Si la mémoire disponible est limitée, le tri par fusion peut poser des problèmes en raison de son utilisation intensive de la pile d’appels pour la récursion. Dans de tels cas, une version itérative du tri par fusion ou un autre algorithme de tri adapté à ces contraintes peut être plus approprié.
// Exemple d'implémentation itérative du tri par fusion
void tri_fusion_iteratif(int arr[], int n) {
for (int taille = 1; taille < n; taille = 2 * taille) {
for (int debut = 0; debut < n - 1; debut += 2 * taille) {
int milieu = min(debut + taille - 1, n - 1);
int fin = min(debut + 2 * taille - 1, n - 1);
fusion(arr, debut, milieu, fin);
}
}
}
En considérant ces cas particuliers, il est important de choisir judicieusement l’algorithme de tri en fonction des caractéristiques spécifiques des données à trier et des contraintes du système sur lequel l’algorithme sera exécuté.
Bien sûr, voici les paragraphes réécrits avec des extraits de code intégrés :
Le tri par fusion a une complexité temporelle en moyenne de O(n log n), ce qui en fait l’un des algorithmes de tri les plus efficaces pour les grandes quantités de données. Cependant, sa complexité spatiale est de O(n), ce qui signifie qu’il utilise une quantité significative de mémoire supplémentaire pour stocker les tableaux temporaires pendant le processus de tri.
// Exemple de tri par fusion
tri_fusion(arr, 0, n - 1);
Le tri par fusion est un algorithme stable, ce qui signifie que l’ordre relatif des éléments égaux est préservé après le tri. Cela le rend utile dans des cas où l’ordre initial des éléments est important et doit être conservé dans le résultat trié.
// Exemple de tri par fusion stable
if (L[i] <= R[j]) {
arr[k] = L[i];
i++;
} else {
arr[k] = R[j];
j++;
}
Bien que le tri par fusion soit efficace pour trier de grandes quantités de données, il peut ne pas être le meilleur choix pour trier de petits tableaux en raison de son coût supplémentaire de récursion. Dans de tels cas, d’autres algorithmes de tri tels que le tri par insertion peuvent être plus appropriés.
// Exemple de tri par insertion pour de petits tableaux
tri_insertion(arr, n);
Le tri par fusion utilise la récursion pour diviser le tableau en sous-tableaux plus petits jusqu’à ce que chaque sous-tableau soit composé d’un seul élément. Ensuite, les sous-tableaux sont fusionnés récursivement jusqu’à ce que le tableau entier soit trié. Cette approche diviser pour régner permet de réduire la complexité temporelle de l’algorithme.
// Fonction récursive pour trier les sous-tableaux
tri_fusion(arr, left, mid);
tri_fusion(arr, mid + 1, right);
Il est important de prendre en compte les cas limites lors de l’implémentation du tri par fusion, tels que les tableaux vides ou de taille un. Ces cas doivent être gérés correctement pour garantir le bon fonctionnement de l’algorithme dans toutes les situations.
// Cas limite : tableau de taille un
if (left < right) {
// Code de tri par fusion
}
Qu’est-ce que le tri par fusion en C ?
Le tri par fusion en C est un algorithme de tri efficace basé sur la fusion de sous-listes.
Comment implémenter le tri par fusion ?
L’implémentation du tri par fusion en C nécessite la récursion pour diviser et fusionner les listes.
Le tri par fusion est-il stable ?
Oui, le tri par fusion est stable, préservant l’ordre relatif des éléments égaux lors du tri.
Quelle est la complexité temporelle du tri par fusion ?
Oui, le tri par fusion est stable, préservant l’ordre relatif des éléments égaux lors du tri.
Comment choisir entre tri par fusion et tri rapide ?
Choisissez le tri par fusion pour des données peu sensibles aux pires cas, sinon optez pour le tri rapide.
Peut-on trier des types de données complexes avec le tri par fusion ?
Oui, le tri par fusion peut trier efficacement des structures de données complexes comme des structures imbriquées.
Quels sont les avantages du tri par fusion par rapport aux autres algorithmes ?
Les avantages incluent sa stabilité, sa facilité d’implémentation récursive et sa bonne performance sur des données moyennes.
Comment détecter et éviter les dépassements de pile lors de la récursion ?
Surveillez la profondeur de récursion et limitez-la, ou utilisez une approche itérative pour éviter les dépassements de pile.
Le tri par fusion est-il approprié pour les tableaux de grande taille ?
Surveillez la profondeur de récursion et limitez-la, ou utilisez une approche itérative pour éviter les dépassements de pile.
Comment optimiser l’implémentation du tri par fusion pour les performances maximales ?
Optimisez l’algorithme en minimisant les appels récursifs, en évitant les copies de données inutiles, etc.
Ce cours se concentre sur les audits et la phase après la mise en place…
Une fois que votre entreprise a obtenu la certification ISO 9001, il est crucial de…
Une carte de positionnement concurrentiel est un outil visuel qui aide à évaluer la position…
Titre : Le Père Goriot Auteur : Honoré de BalzacDate de publication : 1834-1835Genre :…
Pour rédiger un projet en Python concernant la maintenance des machines, voici un exemple de…
La méthode join en Python est un outil puissant pour concaténer des éléments d'une séquence…
This website uses cookies.