ACM演算法入門——二分查詢
阿新 • • 發佈:2018-12-24
二分
概述:二分在查詢時用得比較多,複雜度為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 - 1;
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
-----------*/
測試結果:
讀者也可以自行輸入幾組資料測試