二分查找这么写为什么不行,初学者

img

#include
using namespace std;
int n,m;
int a[10001], b[10001];
int l = 0, r = m - 1, mid = (l + r)/2;
bool binary(int x) {
while(l < r && b[mid] != x) {
if(b[mid] < x) {
l++;
mid = (l + r)/2;
}
else {
r--;
mid = (l + r)/2;
}
}
if(b[mid] == x) return 1;
else return 0;
}

int main() {
cin >> n >> m;
for(int i = 0;i < n;i++) scanf("%d",&a[i]);
for(int i = 0;i < m;i++) scanf("%d",&b[i]);
sort(b + 0,b + m);
for(int i = 0;i < n;i++) if( binary(a[i]) ) printf("%d ",a[i]);
return 0;
}

每次调用二分查找时,l和r应该重新赋值为0和m-1,所以应该定义到函数里面去

#include <algorithm>
#include <cstring>
#include <iostream>
using namespace std;

int n, m;
int a[10001], b[10001];

bool binary(int x) {
    int l = 0, r = m - 1, mid = (l + r) / 2;
    while (l < r && b[mid] != x) {
        if (b[mid] < x) {
            l++;
            mid = (l + r) / 2;
        } else {
            r--;
            mid = (l + r) / 2;
        }
    }
    if (b[mid] == x)
        return 1;
    else
        return 0;
}

int main() {
    cin >> n >> m;
    for (int i = 0; i < n; i++) scanf("%d", &a[i]);
    for (int i = 0; i < m; i++) scanf("%d", &b[i]);
    sort(b + 0, b + m);
    for (int i = 0; i < n; i++)
        if (binary(a[i])) printf("%d ", a[i]);
    return 0;
}

l,r初始化不对。n和m还没输入呢