题目描述:
实现折半查找。要求查找给定的值在数据表中相应的存储位置。本题目假定输入元素均按非降序输入。
输入:
输入包含若干个测试用例,第一行为测试用例个数k。每个测试用例占3行,其中第一行为元素个数n,第二行为n个元素值,即数据表中的元素,第三行为需要查找的元素。
输出:
对每一测试用例,分别用一行输出两个值,分别表示相应的位置和查找次数,用空格隔开。如果查找不成功,则位置表0表示。
输入样例:
1
5
1 2 4 7 9
4
输出样例:
3 1
代码:
cpp
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<string.h>
#include<algorithm>
#include<cmath>
#include<vector>
#include<queue>
#include<stack>
#include<map>
using namespace std;
typedef pair<int,int> PII;
const int N = 1e5 + 10;
int main(){
int k;
cin >> k;
while(k --){
int n;
cin >> n;
int a[1024];
for(int i = 1;i <= n;i ++){
cin >> a[i];
}
int num;
cin >> num;
int sum = 0;
int l = 1,r = n;
while(l < r){
int mid = l + r + 1 >> 1;
if(a[mid] > num) r = mid - 1 ;
else l = mid;
sum ++;
}
cout << r << ' ' << sum-1 << endl;
}
return 0;
}
板子:
cpp
// 区间[l, r]被划分成[l, mid]和[mid + 1, r]时使用:
int bsearch_1(int l, int r)
{
while (l < r)
{
int mid = l + r >> 1;
if (check(mid)) r = mid; // check()判断mid是否满足性质
else l = mid + 1;
}
return l;
}
// 区间[l, r]被划分成[l, mid - 1]和[mid, r]时使用:
int bsearch_2(int l, int r)
{
while (l < r)
{
int mid = l + r + 1 >> 1;
if (check(mid)) l = mid;
else r = mid - 1;
}
return l;
}