模板原地址,從大佬那里習(xí)得的
另一位的解析,下面有更具體的分析
模板一共有兩種,適用于兩種不同的情況,第一種是:
int bsearch_1(int l, int r)
{
while (l < r)
{
int mid = l + r >> 1;
if (check(mid)) r = mid;
else l = mid + 1;
}
return l;
}
我們通過實(shí)際數(shù)據(jù)來演示下查找過程
假如說我們用該算法查找以上數(shù)據(jù)中 8的坐標(biāo)

經(jīng)過第一次查詢后,mid= (l+r)/2=2 結(jié)果5小于8 l=mid+1=3

第一次
經(jīng)過第二次后 mid=(l+r)/2=4 結(jié)果9大于8 r=4

第二次
經(jīng)過第三次查詢后 mid=(l+r)/2=3 結(jié)果7小于8
此時(shí)l=mid+1=4

第三次
此次運(yùn)行完之后,l==r==4
此時(shí)返回l=4 結(jié)果為9,值為數(shù)組中大于8的值中的最小值
到此模板1結(jié)束
模板2:
int bsearch_2(int l, int r)
{
while (l < r)
{
int mid = l + r + 1 >> 1;
if (check(mid)) l = mid;
else r = mid - 1;
}
return l;
}
采用同樣的數(shù)據(jù),查找8

第一次查找后: mid=(l+r+1)/2=3 值為7小于8 l=mid=3

第一次
第二次查找后: mid=(l+r+1)/2=4 值為9大于8
此時(shí)r=mid-1=3

第二次
此時(shí) l==r==3
返回結(jié)果為 7,為小于8的值中的最大值