Deutsche Lernausgabe
Mergesort in C
Teilen, sortieren und verschmelzen Sie Arrays in O(N log N).

Mergesort teilt das Intervall bis zu Teilen mit einem Element. Beim Rückweg verschmilzt es zwei sortierte Teile, indem jeweils das kleinere der ersten verbleibenden Elemente gewählt wird.
Kopieren Sie anschließend die verbleibenden Elemente beider Hälften. Bei Gleichheit das linke Element zu wählen, erhält die Stabilität. Die übliche Variante verwendet O(N) Hilfsspeicher zusätzlich zum Rekursionsstack.
Testen Sie ungerade Größen, Duplikate und die Grenzen des Zwischenpuffers. Ohne zusätzliche Optimierung bleibt der Aufwand auch bei bereits sortierter Eingabe O(N log N).
Quellcode
#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;
}Im Compiler öffnenErwartetes Ergebnis
MergeSorted Array: 3 9 10 27 38 43 82
Häufige Fragen
Warum bleiben Code und manche Ausgaben englisch?
C-Schlüsselwörter, Bezeichner, Programmkommentare und erwartete Ausgaben bleiben wie im Original, damit der Code ausführbar und die Tests konsistent bleiben. Erklärungen und Aufgabenstellungen sind übersetzt.