提交 3d8322c7 编写于 作者: F Fangrui Song 提交者: Rich Felker

bsearch: simplify and optimize

maintainer's note: the key observation here is that the compared
element is the first slot of the second ceil(half) of the array, and
thus can be removed for further comparison when it does not match, so
that we descend into the second ceil(half)-1 rather than ceil(half)
elements. this change ensures that nel strictly decreases with each
iteration, so that the case of != but nel==1 does not need to be
special-cased anymore.
上级 f2c6dbe2
......@@ -7,13 +7,13 @@ void *bsearch(const void *key, const void *base, size_t nel, size_t width, int (
while (nel > 0) {
try = (char *)base + width*(nel/2);
sign = cmp(key, try);
if (!sign) return try;
else if (nel == 1) break;
else if (sign < 0)
if (sign < 0) {
nel /= 2;
else {
base = try;
nel -= nel/2;
} else if (sign > 0) {
base = (char *)try + width;
nel -= nel/2+1;
} else {
return try;
}
}
return NULL;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册