首先找到这串数字中间位置的那个数,然后与需要查询的数比较
如果要查询的数小于中间那个数,那么答案肯定在左边
如果要查询的数大于中间那个数,那么答案肯定在右边
如果等于的话继续在左边找,因为找到的位置还不能确定是第一个数
如此重复,直到要查l>r
#include <cstdio>
using namespace std;
int n, m, q, a[1000005];
int find(int x) { //二分查找
int l = 1, r = n;
while (l < r) {//这里不能写等号,因为底下的r并没有加1,写等号会导致死循环。
int mid = l + (r - l) / 2;
if (a[mid] >= x)
r = mid;//由于等于的话还得在查找之前是否有更早出现的,所以不加1
else
l = mid + 1;
}
if (a[l] == x)
return l; //找都了就输出他的位置
else
return -1; // 没找到输出-1
}
int main() {
scanf("%d %d", &n, &m); //读入
for (int i = 1 ; i <= n ; i++)
scanf("%d", &a[i]); //还是读入
for (int i = 1 ; i <= m ; i++) {
scanf("%d", &q);
int ans = find(q); //看看查找的结果
printf("%d ", ans); //输出
}
return 0;
}
。