C语言二分查找法

参考了C语言中折半查找法(二分法)的实现
二分查找算法(C语言实现)
先附上代码

#include<stdio.h>
int BinSearch(int arr[],int len,int key)                          //折半查找法(二分法)
{
	int low=0;                         //定义初始最小
	int high=len-1;                 //定义初始最大
	int mid;                            //定义中间值
	while(low<=high)
	{
		mid=(low+high)/2;              //找中间值
		if(key==arr[mid])               //判断min与key是否相等
			return mid;    
		else if(key>arr[mid])             //如果key>mid  则新区间为[mid+1,high]
			low=mid+1;
		else                                       //如果key<mid  则新区间为[low,mid-1]
			high=mid-1;
	}
	return -1;                             //如果数组中无目标值key,则返回 -1 ;
}
int main()
{
	int arr[]={1,2,3,4,5,6,7,8,9,10,11};                      //首先要对数组arr进行排序
	printf("%d \n",BinSearch(arr,(sizeof(arr)/sizeof(arr[0])),7));
	return 0;
}

(此代码为参考博客中复制粘贴的代码)
一直困惑于为什么不能直接把low=mid或者high=mid,后来看到一个例子,如下:

若要查找98,如果按照我原本的做法,当low=9,high=10时,mid将会一直等于9,这将一直查找不到98。
如果按照正确做法,不仅可以直接将所要查找的数不属于的那一部分直接舍去(比如当mid不等于所要查找的数,low=mid+1或者high=mid-1,就可以直接将mid所代表的数在后续判断中舍去),还可以避免两数相除取整一直得到同一个数的bug。

猜你喜欢

转载自www.cnblogs.com/ponynice/p/12743991.html