二分查找
**概述:**二分在查找时用得比较多,复杂度为O(logn),使用二分的前提要求数据按顺序排列(如:1 2 2 2 4 5 6 7),如果数据不顺序,需要对数据进行排序,排序复杂度为O(n*logn)。
代码演示:
#include <cstdio>
#include <iostream>
#include <cstring> //memset函数头文件
#include <algorithm> //排序函数sort所在的头文件
using namespace std;
const int MaxN = 1e5 + 5;
#define debug(x) cout << #x << "=" << x << endl;
int main(){
int n, m, t;
int a[MaxN];
cin >> t;
while(t--){
memset(a, 0, sizeof(a)); //清空数组
cin >> n >> m;
for (int i = 1; i <= n; i++) cin >> a[i]; // 输入
sort(a + 1, a + 1 + n); //非递减排序
int l = 1, r = n;
int ans = 0;
// 二分
while(l < r) {
int mid = (l+r) / 2;
if(a[mid] > m){
r = mid;
if(a[mid] == m) ans++;
}
else l = mid + 1;
}
cout << ans << endl;
}
return 0;
}
/*---------
测试数据:
2
10 2
50 2 3 5 46 9 100 2 5 89
5 5
1 2 0 4 3
-----------*/
测试结果:
读者也可以自行输入几组数据测试