std.sort.partitionPoint: faster implementation (#30005)

Migrated from https://github.com/ziglang/zig/pull/21419

Co-authored-by: Jonathan Hallstrom <lmj.hallstrom@gmail.com>
Reviewed-on: https://codeberg.org/ziglang/zig/pulls/30005
This commit is contained in:
Andrew Kelley 2025-11-27 20:48:54 +01:00
parent 854774d468
commit e427ba9cd5

View file

@ -678,18 +678,23 @@ pub fn partitionPoint(
context: anytype, context: anytype,
comptime predicate: fn (@TypeOf(context), T) bool, comptime predicate: fn (@TypeOf(context), T) bool,
) usize { ) usize {
var low: usize = 0; var it: usize = 0;
var high: usize = items.len; var len: usize = items.len;
while (low < high) { while (len > 1) {
const mid = low + (high - low) / 2; const half: usize = len / 2;
if (predicate(context, items[mid])) { len -= half;
low = mid + 1; if (predicate(context, items[it + half - 1])) {
} else { @branchHint(.unpredictable);
high = mid; it += half;
} }
} }
return low;
if (it < items.len) {
it += @intFromBool(predicate(context, items[it]));
}
return it;
} }
test partitionPoint { test partitionPoint {