为何二分查找代码始终返回-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
相关产品推荐
相关产品推荐

