23 lines
751 B
Zig
23 lines
751 B
Zig
const math = @import("std").math;
|
|
|
|
pub fn binarySearch(comptime T: type, input: []const T, search_value: T) ?usize {
|
|
if (input.len == 0) return null;
|
|
if (@sizeOf(T) == 0) return 0;
|
|
|
|
return binarySearchInner(T, input, search_value, 0, input.len - 1);
|
|
}
|
|
|
|
fn binarySearchInner(comptime T: type, input: []const T, search_value: T, low: usize, high: usize) ?usize {
|
|
if (low > high) return null;
|
|
|
|
const mid = ((high - low) / 2) + low;
|
|
const mid_elem: T = input[mid];
|
|
|
|
return if (mid_elem > search_value)
|
|
binarySearchInner(T, input, search_value, low, math.sub(usize, mid, 1) catch return null)
|
|
else if (mid_elem < search_value)
|
|
binarySearchInner(T, input, search_value, mid + 1, high)
|
|
else
|
|
mid;
|
|
}
|