二分查詢自用模板

2021-10-01 13:28:56 字數 2116 閱讀 2402

二分查詢演算法用於在乙個有序的列表中查詢某個值的位置,列表一般是公升序排列的。迴圈比較中間值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 對...