21 lines
717 B
Zig
21 lines
717 B
Zig
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;
|
|
|
|
var view: []const T = input;
|
|
const item_ptr: *const T = item_ptr: while (view.len > 0) {
|
|
const mid = (view.len - 1) / 2;
|
|
const mid_elem_ptr: *const T = &view[mid];
|
|
|
|
if (mid_elem_ptr.* > search_value)
|
|
view = view[0..mid]
|
|
else if (mid_elem_ptr.* < search_value)
|
|
view = view[mid + 1 .. view.len]
|
|
else
|
|
break :item_ptr mid_elem_ptr;
|
|
} else return null;
|
|
|
|
const distance_in_bytes = @intFromPtr(item_ptr) - @intFromPtr(input.ptr);
|
|
return (distance_in_bytes / @sizeOf(T));
|
|
}
|