Online C Compiler
Ouvrir dans le compilateur

Édition pédagogique en français

Tri fusion en C

Divisez, triez et fusionnez des tableaux en O(N log N).

Ouvrir dans le compilateur

Tri fusion en C
Divisez, triez et fusionnez des tableaux en O(N log N).

Merge sort divise l’intervalle jusqu’à obtenir des parties d’un élément. Au retour des appels, il fusionne deux parties triées en choisissant à chaque fois le plus petit des premiers éléments restants.

Copiez ensuite les éléments restants de chaque moitié. Prendre l’élément gauche en cas d’égalité permet de conserver la stabilité. La version habituelle utilise O(N) de mémoire auxiliaire, en plus de la pile de récursion.

Testez les tailles impaires, les doublons et les limites du tampon temporaire. Sans optimisation supplémentaire, le coût reste O(N log N) même pour une entrée déjà triée.

Code source

#include <stdio.h>
#include <stdlib.h>

int merge(int arr[], int l, int m, int r) {
    int n1 = m - l + 1;
    int n2 = r - m;
    int *L = (int *)malloc(n1 * sizeof(int));
    int *R = (int *)malloc(n2 * sizeof(int));

    if (L == NULL || R == NULL) {
        free(L);
        free(R);
        return 0;
    }

    for (int i = 0; i < n1; i++) L[i] = arr[l + i];
    for (int j = 0; j < n2; j++) R[j] = arr[m + 1 + j];

    int i = 0, j = 0, k = l;
    while (i < n1 && j < n2) {
        if (L[i] <= R[j]) arr[k++] = L[i++];
        else arr[k++] = R[j++];
    }
    while (i < n1) arr[k++] = L[i++];
    while (j < n2) arr[k++] = R[j++];

    free(L);
    free(R);
    return 1;
}

int mergeSort(int arr[], int l, int r) {
    if (l < r) {
        int m = l + (r - l) / 2;
        if (!mergeSort(arr, l, m) || !mergeSort(arr, m + 1, r)) return 0;
        return merge(arr, l, m, r);
    }
    return 1;
}

int main() {
    int arr[] = {38, 27, 43, 3, 9, 82, 10};
    int n = sizeof(arr) / sizeof(arr[0]);
    if (!mergeSort(arr, 0, n - 1)) {
        fputs("Memory allocation failed.\n", stderr);
        return EXIT_FAILURE;
    }
    printf("MergeSorted Array:\n");
    for (int i = 0; i < n; i++) printf("%d ", arr[i]);
    printf("\n");
    return 0;
}
Ouvrir dans le compilateur

Résultat attendu

MergeSorted Array:
3 9 10 27 38 43 82

Questions fréquentes

Pourquoi le code et certains résultats restent-ils en anglais ?

Les mots-clés C, les identifiants, les commentaires du programme et les sorties attendues restent ceux de la version originale pour conserver un code exécutable et des tests cohérents. Les explications et les consignes sont traduites.