二分类型:
可以分为循环和递归。
循环:
#pragma GCC optimlize("O3")
#include<iostream>
#include<algorithm>
using namespace std;
int a[1000];
int BSearch(int l, int r, int val)
{
int mid;
int ans = 0;
do
{
mid = (l + r) >> 1;
if (a[mid] <= val) //保证在
{
l = mid + 1;
ans = mid;
}
else
{
r = mid - 1;
}
} while (l <= r);
return ans;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int n, i, x;
cin >> n >> x;
for (i = 1; i <= n; ++i)
cin >> a[i];
sort(a + 1, a + 1 + n);
cout << BSearch(1, n, x) << endl; //注意边界一定要能够取到
return 0;
}
8 2
1 2 2 2 2 2 2 3
对于以上输入,结果是
7
这种二分能够保证在搜索的数据有多个的情况下,输出下标最大的一个。
同时如果不能找到这个数据,可以输出比这个数据小的数据中最大的那个数字的下标
例如输入
8 5
1 2 3 4 6 7 9 11
结果是
4
递归:
递归类型则可以参考
二分搜索算法