二分查找模板

模板原地址,從大佬那里習(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的值中的最大值

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容