二分查找算法用于在一个有序的列表中查找某个值的位置,列表一般是升序排列的。循环比较中间值A[mid]和需要查找的值x,如果x小于等于中间值,那么在左边找;如果x大于中间值,那么去右边找。
二分查找的思想很简单,但是有很多种写法,我自己用的模板是仿照STL的二分函数,即有两个版本,一个是查找第一个大于等于x的值的下标,若找不到则返回尾后指针;另一个版本是查找第一个大于x的值的下标,找不到返回尾后指针。
我的自用二分模板
#include <bits/stdc++.h>
using namespace std;
// 找出第一个大于等于x的元素的下标
int search_lower_bound(int *A, int left, int len, int x) {
int mid, right = left + len;
while (left < right) {
mid = (left + right) / 2;
if (x <= A[mid])
right = mid;
else
left = mid + 1;
}
return left;
}
// 找出第一个大于x的元素的下标
int search_upper_bound(int *A, int left, int len, int x) {
int mid, right = left + len;
while (left < right) {
mid = (left + right) / 2</