二分查詢(模板)

2022-05-03 14:27:21 字數 1822 閱讀 6589

**自:

二分查詢很好寫,卻很難寫對,出錯原因主要集中在判定條件和邊界值的選擇上,很容易就會導致越界或者死迴圈的情況。

下面對二分查詢及其變形進行總結:

如果環境允許,可以用庫函式直接使用

二分查詢的函式有 3 個: 參考:

標頭檔案是#include

lower_bound(起始位址,結束位址,要查詢的數值) - 起始位址

upper_bound(起始位址,結束位址,要查詢的數值) - 起始位址

binary_search(起始位址,結束位址,要查詢的數值) 

說明:lower_bound()和upper_bound()返回的位址,都是從位置1開始算起的,[ first, last ),即first最小是從1開始的

功能:函式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#include

using

namespace

std;

int a[1005

];int

main()

view code

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 - 1low = mid + 1

eg:a = [1,3,3,5, 7 ,7,7,7,8,14,14]

target = 7

return 4

int a[100005

];int find2(int target,int l,int

r)

if (left <= r && a[left] ==target)

return

left;

else

return -1

;}

eg:a = [1,3,3,5,7,7,7, 7 ,8,14,14]

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 對...