C Fundamentals
Algorithms · data structures · cryptography · systems — pure C11, zero deps
Loading...
Searching...
No Matches
quicksort.c
Go to the documentation of this file.
1/**
2 * @file quicksort.c
3 * @brief Quicksort using Lomuto partition.
4 *
5 * Average O(n log n), worst O(n²) on already-sorted input. Tail-recursion
6 * on the smaller partition would bound the stack depth at O(log n) — kept
7 * straightforward here for readability.
8 */
9
10#include "sorts.h"
11#include <string.h>
12
13/* ── String variant ─────────────────────────────────────────────────── */
14
15static void swap_str(char **a, char **b) {
16 char *t = *a;
17 *a = *b;
18 *b = t;
19}
20
21static long lomuto_partition_str(char **arr, long lo, long hi) {
22 char *pivot = arr[hi];
23 long i = lo - 1;
24 for (long j = lo; j < hi; j++) {
25 if (strcmp(arr[j], pivot) <= 0) {
26 i++;
27 swap_str(&arr[i], &arr[j]);
28 }
29 }
30 swap_str(&arr[i + 1], &arr[hi]);
31 return i + 1;
32}
33
34static void quicksort_str_recursive(char **arr, long lo, long hi) {
35 if (lo < hi) {
36 long p = lomuto_partition_str(arr, lo, hi);
37 quicksort_str_recursive(arr, lo, p - 1);
38 quicksort_str_recursive(arr, p + 1, hi);
39 }
40}
41
42void quicksort_strings(char **arr, size_t n) {
43 if (n <= 1) return;
44 quicksort_str_recursive(arr, 0, (long)n - 1);
45}
46
47/* ── Integer variant ────────────────────────────────────────────────── */
48
49static void swap_int(int *a, int *b) {
50 int t = *a;
51 *a = *b;
52 *b = t;
53}
54
55static long lomuto_partition_int(int *arr, long lo, long hi) {
56 int pivot = arr[hi];
57 long i = lo - 1;
58 for (long j = lo; j < hi; j++) {
59 if (arr[j] <= pivot) {
60 i++;
61 swap_int(&arr[i], &arr[j]);
62 }
63 }
64 swap_int(&arr[i + 1], &arr[hi]);
65 return i + 1;
66}
67
68static void quicksort_int_recursive(int *arr, long lo, long hi) {
69 if (lo < hi) {
70 long p = lomuto_partition_int(arr, lo, hi);
71 quicksort_int_recursive(arr, lo, p - 1);
72 quicksort_int_recursive(arr, p + 1, hi);
73 }
74}
75
76void quicksort_ints(int *arr, size_t n) {
77 if (n <= 1) return;
78 quicksort_int_recursive(arr, 0, (long)n - 1);
79}
static void swap_int(int *a, int *b)
Definition quicksort.c:49
void quicksort_ints(int *arr, size_t n)
Definition quicksort.c:76
static long lomuto_partition_int(int *arr, long lo, long hi)
Definition quicksort.c:55
static void quicksort_int_recursive(int *arr, long lo, long hi)
Definition quicksort.c:68
static long lomuto_partition_str(char **arr, long lo, long hi)
Definition quicksort.c:21
static void swap_str(char **a, char **b)
Definition quicksort.c:15
void quicksort_strings(char **arr, size_t n)
Definition quicksort.c:42
static void quicksort_str_recursive(char **arr, long lo, long hi)
Definition quicksort.c:34
Unified header for all sorting algorithms.