1. 程式人生 > >已排序陣列二分查詢

已排序陣列二分查詢

劉汝佳 紫書提供方法:

//正確答案在[x,y)區間之內,即不會包括y。

//這種方法老是兩個細節搞不順,如下標註

int bsearch(int* a, int x,int y,int test)
{
    int m;
    while(x<y)    //1.這裡判斷條件為什麼不是x<=y(因為不包括y,所以x==y時就說明區間內沒有正確答案了
    {
        m = (x+y)/2;
        if(a[m]==test)
            return m;
        else if(a[m]>test)
            y=m;   //2.為什麼不是y=m-1,=(因為區間y不可能是正確答案,m此時已經斷定不是正確答案,但是m-1有可能是正確答案,所以不能賦值m-1)
else x=m+1;//這裡加一是因為求中位數m除2時會取較小值,如果答案為m+1,那麼不加一就永遠得不到答案。 } return -1;//沒有正確答案時返回-1 }

下面是一種邏輯清晰通順的實現寫法(只有兩個小細節不一樣,但理解起來很自然)
以後只用這個

//正確答案區間在[x,y],兩個賦值語句形式相同
int bsearchWithoutRecursion(int array[], int low, int high, int target)
{
    while(low <= high)
    {
        int
mid = (low + high)/2; if (array[mid] > target) high = mid - 1; else if (array[mid] < target) low = mid + 1; else //find the target return mid; } //the array does not contain the target return -1; }