19 lines
754 B
Zig
19 lines
754 B
Zig
pub fn binarySearch(comptime T: type, input: []const T, search_value: T) ?usize {
|
|
return binarySearchInner(T, input, search_value, @intFromPtr(input.ptr));
|
|
}
|
|
|
|
fn binarySearchInner(comptime T: type, input: []const T, search_value: T, start_address: usize) ?usize {
|
|
if (input.len == 0) return null;
|
|
if (@sizeOf(T) == 0) return 0;
|
|
|
|
const mid = (input.len - 1) / 2;
|
|
const mid_elem_ptr: *const T = &input[mid];
|
|
|
|
return if (mid_elem_ptr.* > search_value)
|
|
binarySearchInner(T, input[0..mid], search_value, start_address)
|
|
else if (mid_elem_ptr.* < search_value)
|
|
binarySearchInner(T, input[mid + 1 .. input.len], search_value, start_address)
|
|
else
|
|
(@intFromPtr(mid_elem_ptr) - start_address) / @sizeOf(T);
|
|
}
|