二分查找最接近的数值m,程序无法运行,有输入没有输出

01:查找最接近的元素
查看提交统计提问
总时间限制: 1000ms 内存限制: 65536kB
描述
在一个非降序列中,查找与给定值最接近的元素。

输入
第一行包含一个整数n,为非降序列长度。1 <= n <= 100000。
第二行包含n个整数,为非降序列各元素。所有元素的大小均在0-1,000,000,000之间。
第三行包含一个整数m,为要询问的给定值个数。1 <= m <= 10000。
接下来m行,每行一个整数,为要询问最接近元素的给定值。所有给定值的大小均在0-1,000,000,000之间。
输出
m行,每行一个整数,为最接近相应给定值的元素值,保持输入顺序。若有多个值满足条件,输出最小的一个。

程序没有输出。


#include<bits/stdc++.h>
using namespace std;
const int MAXN=100000+5;
int a[MAXN],r[MAXN];
int compare(int m1,int n1,int x1){
    if(m1-x1>n1-x1) return n1;
    else return m1;
}
void msort(int s,int t){
    if(s==t) return;
    int mid=(s+t)/2;
    msort(s,mid);
    msort(mid+1,t);
    int i=s,j=mid+1,k=s;
    while(i<=mid&&j<=s){
        if(a[i]<a[j]){
            r[k]=a[j];j++;k++;
        }
        else{
            r[k]=a[i];i++;k++;
        }
    }
    while(i<=mid){
        r[k]=a[i];i++;k++;
    }
    while(j<=s){
        r[k]=a[j];j++;k++;
    }
     for(i=s;i<=t;i++) a[i]=r[i];
}
int DFind(int s,int t,int m2){
    int mid=(s+t)/2;
    if(a[s]<m2&&a[t]>m2) return compare(a[s],a[t],m2);
    if(a[mid]==m2) return a[mid];
    if(a[mid]<m2) return DFind(s,mid,m2);
    else return DFind(mid+1,t,m2); 
}

int main(){
    int n,mn,m[10005];
    cin>>n;
    for(int i=0;i<n;i++){
        cin>>a[i];
    }
    cin>>mn;
    for(int i=0;i<mn;i++){
        cin>>m[i];
    }
    for(int i=0;i<mn;i++){
        cout<<DFind(0,n,m[i]);
    }
    return 0;

}
#include <iostream>
#include <cmath>

using namespace std;

int main()
{
    int n, m;
    cin >> n;
    int *numbers = new int[n];
    for (int i = 0; i < n; i++) cin >> numbers[i];
    cin >> m;
    while (m--)
    {
        int x;
        cin >> x;
        int left = 0, right = n - 1;
        while (left < right)
        {
            int mid = (left + right) / 2;
            if (numbers[mid] >= x) right = mid;
            else left = mid + 1;
        }
        if (left == 0) cout << numbers[0] << endl;
        else if (left == n - 1) cout << numbers[n - 1] << endl;
        else if (abs(numbers[left] - x) < abs(numbers[left - 1] - x)) cout << numbers[left] << endl;
        else cout << numbers[left - 1] << endl;
    }
    return 0;
}

错误很多,首先主函数里,a[n]没有值,怎么能传参n呢?

cout<<DFind(0,n,m[i]);

其次DFind函数就直接是错误的,即使修改了传参也不对,因为第一个if判断的意思是输入元素在首尾元素之间,如果在直接返回首元素或尾元素,当然错误

if(a[s]<m2&&a[t]>m2) return compare(a[s],a[t],m2);

还有比较函数也不对,找最近的元素应该加绝对值,不能直接相减比较

  if(m1-x1>n1-x1) return n1;
    else return m1;

其他的可能还有,没再往下看了