二分查詢演算法用於在乙個有序的列表中查詢某個值的位置,列表一般是公升序排列的。迴圈比較中間值a[mid]和需要查詢的值x,如果x小於等於中間值,那麼在左邊找;如果x大於中間值,那麼去右邊找。
二分查詢的思想很簡單,但是有很多種寫法,我自己用的模板是仿照stl的二分函式,即有兩個版本,乙個是查詢第乙個大於等於x的值的下標,若找不到則返回尾後指標;另乙個版本是查詢第乙個大於x的值的下標,找不到返回尾後指標。
我的自用二分模板
#include
using
namespace std;
// 找出第乙個大於等於x的元素的下標
intsearch_lower_bound
(int
*a,int left,
int len,
int x)
return left;
}// 找出第乙個大於x的元素的下標
intsearch_upper_bound
(int
*a,int left,
int len,
int x)
return left;
}const
int len =8;
int a[len]=;
//公升序陣列
intmain()
return0;
}
兩個函式的唯一區別就是if (x < a[mid])
,如果帶等於號,則返回第乙個大於等於x的值的下標;若不帶等於號,則返回第乙個大於x的值的下標。
stl 二分函式
stl 二分查詢函式更加靈活,它是模板函式,支援多種型別,包括自定義型別(需過載小於運算子),可以傳lambda表示式自定義比較規則。
下面附上兩個demo演示 stl 二分函式如何應用在自定義型別陣列以及降序的整型陣列。
降序陣列demo
#include
using
namespace std;
intmain()
;// 降序陣列
size_t x1 =
lower_bound
(a, a+5,
3,(int a,
int b)
)- a;
size_t x2 =
upper_bound
(a, a+5,
3,(int a,
int b)
)- a;
size_t x3 =
lower_bound
(a, a+5,
4,(int a,
int b)
)- a;
size_t x4 =
upper_bound
(a, a+5,
4,(int a,
int b)
)- a;
cout << x1 << endl;
// 第乙個小於等於3的元素下標
cout << x2 << endl;
// 第乙個小於3的元素下標
cout << x3 << endl;
// 第乙個小於等於4的元素下標
cout << x4 << endl;
// 第乙個小於4的元素下標
return0;
}
自定義型別demo
#include
using
namespace std;
struct mypair
bool
operator
<
(const mypair &other)};
intmain()
,,};
int x =
lower_bound
(v.begin()
, v.
end(),
mypair(3
,4))
- v.
begin()
; cout << x << endl;
return0;
}
二分查詢模板
二分查詢也稱折半查詢 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 對...