二分查詢的原理和實現
一:二分查詢函式,寫一個函式BinarySeach,在包含size個元素,從小到大排序的int陣列a裡查詢元素P,如果找到,則返回元素下標,如果找不到,則返回-1.複雜度為O(log(n))
int BinarySearch(int a[],int size,int p)
{
int L=0;//查詢區間的左端點 int R=size-1;//查詢區間的右端點 while(L<=R)//如果查詢區間不為0就繼續查詢 { int mid=L+(R-L)/2;//取查詢區間正中元素的下標 if(p==a[mid]) return mid;
else if(p>a[mid])
L=mid+1;//設定新的查詢區間的左端點 else R=mid-1;//設定新的查詢區間的右端點 } return -1; }
二:寫一個函式LowerBound,在包含size個元素的,從小到大排序的int陣列a裡查詢比給定整數p小的,下標最大的元素。找到則返回其下標,找不到則返回-1
int LowerBound(int a[],int size,int p) { int L=0;//查詢區間的左端點 int R=size-1;//查詢區間的右端點 int lastpos=-1//到目前為止找到的最優解 while(L<=R)//如果查詢區間不為0就繼續查詢 { int mid=L+(R-L)/2;//取查詢區間正中元素的下標 if(a[mid]>=p) R=mid-1; else { lastpos=mid; L=mid+1; } } return lastpos; }
三:注意
二分查詢的區間必須是排好序的,遞增或遞減的。
為了防止(L+R)過大溢位,通常將 int mid=(L+R)/2;成 int mid=L+(R-L)/2;