求指导下这段二分搜索的代码哪里有问题?

#include<stdio.h>

int search(int key,int a[],int len)
{
int left=0;
int right=len-1;
int ret=-1;
while(left<right){
int mid=(left+right)/2;
if(a[mid]==key){
ret=mid;
break;
}else if(a[mid]<key){
left=mid+1;
}else{
right=mid-1;
}
}
return ret;
}
int main(){
int k=14;
int a[]={1,2,4,9,11,14,17,20,23,25,28,30,34,36,38,39,41,42,46,47,52,54};
int r=search(k,a,sizeof(a)/sizeof(a[0]));
printf("%d",r);
return 0;
}

你这种写法是基于数组有序的前提

mid= low+(high-low)/2

望采纳!谢谢


#include <stdio.h>
 
int main()
{
    int a[15], i, j, n;
    int high, mid, x, low = 0;
    x = sizeof(a) / sizeof(a[0]);
    high = x - 1;
    for (i = 0; i <= 14; i++)
        scanf_s("%d", &a[i]);
    scanf_s("%d", &n);
    while (low <= high)
    {
        mid = low + (high - low) / 2;
        if (a[mid] == n)
        {
            i = mid;
            break;
        }
        else if (a[mid] > n)
            high = mid - 1;
        else
            low = mid + 1;
    }
    if (n<a[0] && n>a[14])
        printf("cannot find %d", n);
    else
        printf("Has found %d, its position is %d", n, mid+1);
    return 0;
}

1.首先,二分查找的应用是基于有序数组的,你的代码中的数组是不符合的,要改为升序。
2.二分查找的边界很重要,你的代码还需修改两个地方,完整代码如下:

#include<stdio.h>

int search(int key,int a[],int len)
{
    int left=0;
    int right=len;//无需len-1
    int ret=-1;
    while(left<right){
        int mid=(left+right)/2;
        if(a[mid]==key){
            ret=mid;
            break;
        }else if(a[mid]<key){
            left=mid+1;
        }else{
            right=mid;//直接赋值mid
        }
    }
    return ret;
}
int main(){
    int k=26;
    int a[]={1,2,3,7,9,14,18,26,48,49,61,63};
    int r=search(k,a,sizeof(a)/sizeof(a[0]));
    printf("%d",r);
    return 0;
}

如有帮助,希望采纳一下