**自:
二分查詢很好寫,卻很難寫對,出錯原因主要集中在判定條件和邊界值的選擇上,很容易就會導致越界或者死迴圈的情況。
下面對二分查詢及其變形進行總結:
如果環境允許,可以用庫函式直接使用
二分查詢的函式有 3 個: 參考:
標頭檔案是#include
lower_bound(起始位址,結束位址,要查詢的數值) - 起始位址說明:lower_bound()和upper_bound()返回的位址,都是從位置1開始算起的,[ first, last ),即first最小是從1開始的upper_bound(起始位址,結束位址,要查詢的數值) - 起始位址
binary_search(起始位址,結束位址,要查詢的數值)
功能:函式lower_bound()在[ first,last )區間進行二分查詢,返回大於或等於val的第乙個元素位置。
注意:如果val不存在,則返回last+1的位置,位置last+1是越界的!!
功能:函式upper_bound()在[ first,last )區間進行二分查詢,返回大於val的第乙個元素位置
注意:如果val剛好在上邊界last的位置上,upper_bound()返回0;如果val不存在,則返回last+1的位置,而位置last+1是越界的!!
功能:判斷查詢的數是否存在,返回的是乙個bool值。
#include#includeview codeusing
namespace
std;
int a[1005
];int
main()
int a[100005其中,有幾個要注意的點:];int find1(int target, int l,int r)//
l,r是查詢的左右區間
return -1
;}
迴圈的判定條件是:low <= high
為了防止數值溢位,mid = low + (high - low)/2
當a[mid]
不等於target
時,high = mid - 1
或low = mid + 1
eg:a = [1,3,3,5, 7 ,7,7,7,8,14,14]
target = 7
return 4
int a[100005eg:a = [1,3,3,5,7,7,7, 7 ,8,14,14]];int find2(int target,int l,int
r)
if (left <= r && a[left] ==target)
return
left;
else
return -1
;}
target = 7
return 7
int a[100005];int find3(int target, int l,int
r)
if (right >= 0 && a[right] ==target)
return
right;
else
return -1
;}
二分查詢模板
二分查詢也稱折半查詢 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 對...