Sorting
Merge Sort (Top-Down)
Split the array recursively, sort each half, then merge two sorted runs into one sorted result.
Algorithm
Basic Implementation
basic.c
#include <stdio.h>
void merge(int arr[], int left, int mid, int right) {
int tmp[5];
int i = left, j = mid + 1, k = 0;
while (i <= mid && j <= right) {
if (arr[i] <= arr[j]) tmp[k++] = arr[i++];
else tmp[k++] = arr[j++];
}
while (i <= mid) tmp[k++] = arr[i++];
while (j <= right) tmp[k++] = arr[j++];
for (i = 0; i < k; ++i) arr[left + i] = tmp[i];
}
void merge_sort(int arr[], int left, int right) {
if (left >= right) return;
int mid = left + (right - left) / 2;
merge_sort(arr, left, mid);
merge_sort(arr, mid + 1, right);
merge(arr, left, mid, right);
}
int main(void) {
int arr[] = {5, 1, 4, 2, 8};
int n = 5;
merge_sort(arr, 0, n - 1);
printf("[");
for (int i = 0; i < n; ++i) {
if (i > 0) printf(", ");
printf("%d", arr[i]);
}
printf("]\n");
return 0;
}
Complexity
- Time: O(n log n)
- Space: O(n)
- Stable: yes
Implementation notes
- C stores
int arr[] = {5, 1, 4, 2, 8}as a fixed local array inmain; this source usesint n = 5and callsmerge_sort(arr, 0, n - 1). merge_sort(int arr[], int left, int right)andmerge(int arr[], int left, int mid, int right)receive the array as a pointer after parameter decay, so recursive calls mutate the original stack array.- Recursion stops at
left >= right;mid = left + (right - left) / 2keeps the bounds as signedintindexes for the small checked input. - Each
mergecall allocatesint tmp[5]on that call's stack and usesi,j, andkto copy the smaller front value, preserving left-side ties witharr[i] <= arr[j]. - Copy-back mutates the original array in order with
arr[left + i] = tmp[i]. The trace shows[5, 1, 4, 2, 8], split as[5, 1]and[4, 2, 8], sorted to[1, 5]and[2, 4, 8], then merged to[1, 2, 4, 5, 8]. - Output is formatted manually with
printf("["), comma-separatedprintf("%d", arr[i]), andprintf("]\n"). Visible memory is the original stack array, recursive stack frames, and per-merge stack buffers; there is no heap allocation.
divide and conquer
Each recursive call solves a smaller sorted subproblem.
merge step
Two sorted halves are combined by repeatedly taking the smaller front item.