C Fundamentals
Algorithms · data structures · cryptography · systems — pure C11, zero deps
Loading...
Searching...
No Matches
binary_search.c
Go to the documentation of this file.
1/**
2 * @file binary_search.c
3 * @brief Iterative + recursive binary search.
4 *
5 * Note the `lo + (hi - lo) / 2` midpoint computation — `(lo + hi) / 2`
6 * would overflow on huge arrays. With size_t we'd need n > SIZE_MAX/2 to
7 * actually trip it, but the safer form is free.
8 */
9
10#include "binary_search.h"
11#include <string.h>
12
13size_t binary_search_ints(const int *arr, size_t n, int target) {
14 if (n == 0) return BSEARCH_NOT_FOUND;
15 size_t lo = 0, hi = n - 1;
16 while (lo <= hi) {
17 size_t mid = lo + (hi - lo) / 2;
18 if (arr[mid] == target) return mid;
19 if (arr[mid] < target) {
20 lo = mid + 1;
21 } else {
22 if (mid == 0) break; /* avoid underflow on size_t */
23 hi = mid - 1;
24 }
25 }
26 return BSEARCH_NOT_FOUND;
27}
28
29size_t binary_search_strings(const char *const *arr, size_t n, const char *target) {
30 if (n == 0 || target == NULL) return BSEARCH_NOT_FOUND;
31 size_t lo = 0, hi = n - 1;
32 while (lo <= hi) {
33 size_t mid = lo + (hi - lo) / 2;
34 int cmp = strcmp(arr[mid], target);
35 if (cmp == 0) return mid;
36 if (cmp < 0) {
37 lo = mid + 1;
38 } else {
39 if (mid == 0) break;
40 hi = mid - 1;
41 }
42 }
43 return BSEARCH_NOT_FOUND;
44}
45
46size_t binary_search_ints_recursive(const int *arr, size_t lo, size_t hi, int target) {
47 if (lo > hi) return BSEARCH_NOT_FOUND;
48 size_t mid = lo + (hi - lo) / 2;
49 if (arr[mid] == target) return mid;
50 if (arr[mid] < target) return binary_search_ints_recursive(arr, mid + 1, hi, target);
51 if (mid == 0) return BSEARCH_NOT_FOUND;
52 return binary_search_ints_recursive(arr, lo, mid - 1, target);
53}
size_t binary_search_strings(const char *const *arr, size_t n, const char *target)
size_t binary_search_ints_recursive(const int *arr, size_t lo, size_t hi, int target)
size_t binary_search_ints(const int *arr, size_t n, int target)
Binary search on sorted arrays. O(log n) time, O(1) space.
#define BSEARCH_NOT_FOUND