Online C Compiler
Apri nel compilatore

Edizione didattica italiana

Merge sort in C: ordinamento per fusione

Dividi un array e unisci le parti ordinate con un buffer temporaneo.

Apri nel compilatore

Merge sort in C: ordinamento per fusione
Dividi un array e unisci le parti ordinate con un buffer temporaneo.

Merge sort divide l’intervallo fino a ottenere parti di un elemento. Al ritorno delle chiamate fonde due parti ordinate scegliendo ogni volta il minore dei primi elementi rimasti.

Copia poi gli elementi rimasti nelle due metà. Scegliere a sinistra in caso di parità conserva la stabilità. La versione usuale usa O(N) memoria ausiliaria, oltre allo stack ricorsivo.

Prova dimensioni dispari, duplicati e limiti del buffer. Senza altre ottimizzazioni, il costo resta O(N log N) anche per input già ordinati.

Codice sorgente

#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;
}
Apri nel compilatore

Risultato atteso

MergeSorted Array:
3 9 10 27 38 43 82

Domande frequenti

Perché il codice e alcuni risultati restano in inglese?

Parole chiave C, identificatori, commenti del programma e output attesi restano quelli originali per preservare codice eseguibile e test coerenti. Spiegazioni e istruzioni sono tradotte.