C Fundamentals
Algorithms · data structures · cryptography · systems — pure C11, zero deps
Loading...
Searching...
No Matches
merge_sort.c
Go to the documentation of this file.
1/**
2 * @file merge_sort.c
3 * @brief Top-down merge sort with explicit auxiliary buffer.
4 *
5 * Stable, O(n log n) worst-case, O(n) extra space. The aux buffer is
6 * allocated once at the top-level call and reused for every merge to
7 * avoid per-recursion malloc churn.
8 */
9
10#include "sorts.h"
11#include <stdlib.h>
12#include <string.h>
13
14/* ── String variant ─────────────────────────────────────────────────── */
15
16static void merge_str(char **arr, char **aux, size_t lo, size_t mid, size_t hi) {
17 for (size_t k = lo; k <= hi; k++) aux[k] = arr[k];
18
19 size_t i = lo, j = mid + 1, k = lo;
20 while (i <= mid && j <= hi) {
21 if (strcmp(aux[i], aux[j]) <= 0) arr[k++] = aux[i++];
22 else arr[k++] = aux[j++];
23 }
24 while (i <= mid) arr[k++] = aux[i++];
25 while (j <= hi) arr[k++] = aux[j++];
26}
27
28static void merge_sort_str_recursive(char **arr, char **aux, size_t lo, size_t hi) {
29 if (lo >= hi) return;
30 size_t mid = lo + (hi - lo) / 2;
31 merge_sort_str_recursive(arr, aux, lo, mid);
32 merge_sort_str_recursive(arr, aux, mid + 1, hi);
33 merge_str(arr, aux, lo, mid, hi);
34}
35
36void merge_sort_strings(char **arr, size_t n) {
37 if (n <= 1) return;
38 char **aux = malloc(n * sizeof(char *));
39 if (!aux) return; /* Graceful degradation — array stays unsorted. */
40 merge_sort_str_recursive(arr, aux, 0, n - 1);
41 free(aux);
42}
43
44/* ── Integer variant ────────────────────────────────────────────────── */
45
46static void merge_int(int *arr, int *aux, size_t lo, size_t mid, size_t hi) {
47 for (size_t k = lo; k <= hi; k++) aux[k] = arr[k];
48
49 size_t i = lo, j = mid + 1, k = lo;
50 while (i <= mid && j <= hi) {
51 if (aux[i] <= aux[j]) arr[k++] = aux[i++];
52 else arr[k++] = aux[j++];
53 }
54 while (i <= mid) arr[k++] = aux[i++];
55 while (j <= hi) arr[k++] = aux[j++];
56}
57
58static void merge_sort_int_recursive(int *arr, int *aux, size_t lo, size_t hi) {
59 if (lo >= hi) return;
60 size_t mid = lo + (hi - lo) / 2;
61 merge_sort_int_recursive(arr, aux, lo, mid);
62 merge_sort_int_recursive(arr, aux, mid + 1, hi);
63 merge_int(arr, aux, lo, mid, hi);
64}
65
66void merge_sort_ints(int *arr, size_t n) {
67 if (n <= 1) return;
68 int *aux = malloc(n * sizeof(int));
69 if (!aux) return;
70 merge_sort_int_recursive(arr, aux, 0, n - 1);
71 free(aux);
72}
static void merge_int(int *arr, int *aux, size_t lo, size_t mid, size_t hi)
Definition merge_sort.c:46
static void merge_sort_str_recursive(char **arr, char **aux, size_t lo, size_t hi)
Definition merge_sort.c:28
static void merge_str(char **arr, char **aux, size_t lo, size_t mid, size_t hi)
Definition merge_sort.c:16
static void merge_sort_int_recursive(int *arr, int *aux, size_t lo, size_t hi)
Definition merge_sort.c:58
void merge_sort_strings(char **arr, size_t n)
Definition merge_sort.c:36
void merge_sort_ints(int *arr, size_t n)
Definition merge_sort.c:66
Unified header for all sorting algorithms.