天天看點

二分查找的兩種正确實作

#include <iostream>
using namespace std;

int binarySearch1(int a[], int n, int x)  //[l, u)區間
{  
    int l, u, m;  
    l = 0;  //左區間閉合
    u = n;  //右區間開放 
    while(l < u)  //用<做判斷,不用<=
    {  
        m = l + ( (u-l) >> 1);  //防止加法(l + u)溢出,不能寫成 m = (l + u) / 2;
        if(x < a[m])  
            u = m;  //因為右區間是開放的,是以右邊不用-1
        else if(x == a[m])  
            return m;  
        else  
            l = m + 1;  
    }  
    return -1;  
}  

int binarySearch2(int a[], int n, int x)  //[l, u]區間
{  
    int l, u, m;  
    l = 0;  //左區間閉合
    u = n - 1;  //右區間閉合 
    while(l <= u)  //用<=做判斷,不用<
    {  
        m = l + ( (u-l) >> 1);  //防止加法(l + u)溢出,不能寫成 m = (l + u) / 2;
        if(x < a[m])  
            u = m - 1;  //因為右區間是閉合的,是以右邊要-1
        else if(x == a[m])  
            return m;  
        else  
            l = m + 1;  
    }  
    return -1;  
}  


int main()
{
    int a[5] = {1, 2, 7, 4, 3};
    cout << binarySearch1(a, 5, 7) << " " << binarySearch2(a, 5, 7) << endl;
    getchar();
    return 0;
}
           

繼續閱讀