You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何二分查找代码始终返回-1?改为arr[]后正常的原因

#include<stdio.h>
int binary_search(int arr[], int size ,int element){
    int low, mid, high; 
    low=0;
    high=size-1;
    //start of search
    while(low<=high)
    {
        mid = (low + high)/2;
        if(arr[mid] == element){
        return mid;
        }
        if(arr[mid]<element){
        low= mid+1;
        }
        else{
        high = mid-1;
        }
    }
    //end of search
    return -1;
}
int main(){
    int arr[20]={1,20,31,44,54,68,70,85};
    int size= sizeof(arr)/sizeof(int);
    int element=44;
    int Si= binary_search(arr,size,element);
    printf("Element was found at index: %d \n",Si);
    return 0;
} 
问题原因解析

二分查找的核心要求是数组必须完全有序,你的代码问题根源就在这里:

  • 声明int arr[20]={1,20,31,44,54,68,70,85};时,C语言会把数组中未显式赋值的12个元素自动初始化为0。此时数组实际内容是[1,20,31,44,54,68,70,85,0,0,...,0](共20个元素),显然这不是有序数组——85后面跟着一堆更小的0,直接破坏了二分查找依赖的有序性。
  • 二分查找会基于整个20元素的无序数组进行判断,逻辑被后面的0干扰,最终找不到目标元素44,返回-1。

改成int arr[]={1,20,31,44,54,68,70,85};后,数组大小会由编译器自动根据初始化元素数量确定为8,整个数组是严格递增的有序数组,sizeof(arr)/sizeof(int)计算出的size是8,二分查找可以正常遍历有序数组,自然能找到目标元素。

额外补充:如果坚持用int arr[20],只要把数组补全为20个递增的数值,代码也能正常运行,但显然让编译器自动推导数组大小更简洁可靠。

内容的提问来源于stack exchange,提问作者Aayush Gupta

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 05:25:13