已排序陣列二分查詢
阿新 • • 發佈:2019-01-05
劉汝佳 紫書提供方法:
//正確答案在[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;
}