相信大家都会二分查找怎么用了,那么现在给你 N 个数的有序序列(下标从 0开始),再给你 M 次询问,对于每次询问给你一个 X,请你找出 X 在序列中最先出现的位置。如果 X 不在序列中请输出 −1。

第一行,空格隔开两个整数 NN 和 MM。

第二行输入 NN 个整数。

之后的 MM 行,每一行一个整数 XX,表示所需要找到的数。

输出格式
对于每次询问输出一个结果。

 样例 1
样例输入
Copy
5 3
1 2 3 3 5
1
3
6

样例输出
Copy
0
2
-1

用基础的C语言,但是一直不能输出-1


#include<stdio.h>

int main(void)
{
    int N,M,X[100],a[100],i,j,flag=1;
    int middle;
    scanf("%d%d",&N,&M);
    for(i=0;i<N;i++)
    {
        scanf("%d",&a[i]);
    }
    
    for(j=0;j<M;j++)
    {
        scanf("%d",&X[j]);
    }
    
    for(i=0;i<M;i++)
    {
        for(j=0;j<N;j++)
        {
            int left=0,right=N-1;
            middle=(left+right)/2;
            while(left<right)
            {
                if(a[middle]==X[j])
                {
                    printf("%d\n",middle);
                    break;
                }
                else if(a[middle]>X[j])
                {
                    right=middle-1;
                }
                else {
                    left=middle;
                }
                middle=(left+right)/2;    
                
            }
            
        }
                if(a[middle]!=X[j])
                {
                    flag=0;
                }    
            if(flag==0) printf("-1");
            
    }
    return 0;
}

最先出现的位置,却使用二分法,这有点教条了吧
if(a[middle]==X[j])
{
printf("%d\n",middle);
break;
}
这个判断也是不对啊,你这不是序列最先出现的位置,是二分法最先找到的位置,如果序列是1 3 3 3 5,你搜索3的话,你想得到的是2,还是1呢?

参考:

#include "stdio.h"
int fun(int a[],int n,int *p){
    int left,right,mid;
   
    left = 0;
    right= n-1;
    while(left<=right){
        //获取中间位置元素的下标
        mid = (left+right)/2;
        if(*p>a[mid]){
            //往右找
            left=mid+1;
        }else if(*p<a[mid]){
            //往左找
            right=mid-1;
        }else{
            break;
        }
    };
    return mid;
    
}
void main()
{
    int a[10]={1,2,3,4,5,8,10,110,120,1000};
    int index = -1;
    int num,cnt=0;
    printf("请输入你要查找的数据:");
    scanf("%d",&num);
       index = fun(a,10,&num);
    printf("%d的位置是:%d",num,index);
}