一、查詢精確值
從乙個有序陣列中找到乙個符合要求的精確值(如猜數遊戲)。如查詢值為key的元素下標,不存在返回-1。
//這裡是left<=right。//考慮這種情況:如果最後剩下a[i]和a[i+1](這也是最容易導致導致死迴圈的情況)首先mid = i,
//如果a[mid] < key,那麼left = mid+1 = i +1,如果是小於號,則a[i + 1]不會被檢查,導致錯誤
int left = 1,right = n;
while(left <= right)
return -1;
二、查詢符合條件的位置
1.查詢第乙個≥key的元素的位置
設a為單調不減整數系列,在系列a中查詢第乙個≥key的數的位置。
int left=1,right=n+1;//為什麼right的初始值為n+1,因為存在著key比所有元素都大的情況int lower_bound(int a,int left,int right,int key)
return left;
}
2.查詢最後乙個≤key的元素的位置
設系列a為單調不減整數系列,在系列a中查詢最後乙個≤key的數的位置。
int left=0,right=n;//left和right邊界初始區間為[0,n],因為key有可能比所有的數都更小
int last_bound(int a,int left,int right,int key){
int mid;
while(left第二種模板比較複雜,它涉及到兩種縮小區間的形式。
形式一:right=mid,left=mid+1,取中間值時mid=(left+right)/2;
形式二:left=mid,right=mid-1,取中間值時mid=(left+right+1)/2;
三、總結
為什麼第二種查詢的迴圈跳出條件是left 二分查詢也稱折半查詢 binary search 它是一種效率較高的查詢方法。演算法思路 假設目標值在閉區間 l,r 中,每次將區間長度縮小一半,當l r時,我們就找到了目標值。模板一當區間 l,r 的更新操作是r mid l mid 1 時,計算mid時不需要加1。int bsearch 1 in... 例如陣列中查詢乙個數 二分查詢的前提是整個陣列是有序的 模板 int a n int l 0,r n 1 int mid,key while l r 另外還有一些二分查詢函式 a.函式模板 binary search arr,arr size indx c.函式功能 在陣列中以二分法檢索的方式查詢,... 二分查詢模板總共有兩個 將區間分為 l,mid l,mid l,mid mid 1,r mid 1,r mid 1 r 時,如下 while l r else 將區間分為 l,mid 1 l,mid 1 l,mid 1 mi d,r mid,r mid,r 時,如下 while l r else 對...二分查詢模板
二分查詢模板
二分查詢模板