模板原地址,從大佬那里習(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ù)據(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
此時l=mid+1=4
此次運行完之后杆煞,l==r==4
此時返回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
此時r=mid-1=3
此時 l==r==3
返回結(jié)果為 7决乎,為小于8的值中的最大值