1. 程式人生 > >二分查詢的原理和實現

二分查詢的原理和實現

一:二分查詢函式,寫一個函式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;