算法:当数据量很大时候适合采用该方法。采用二分查找时,数据需要时有序的

基本思想:假设数据是按升序排序的,对于给定值x,从序列的中间位置开始比较,如果当前位置值等于x,则查找成功;若小于当前位置值,则在数列的前半段中查找;若大于当前位置值 则在数列的后半段中继续查找,知道找到为止。


根据算法思想,有下面代码

int bin_search(int a[], int key,int left, int right)
{
	while (left <= right)
	{
		int mid =(left + right)/2;
		if (a[mid] > key)
		{
			right = mid-1;
		}
		else if (a[mid] < key)
		{
			left = mid+1;
		}
		else if(a[mid] == key)
		{
			return mid;
		}
	}
	return -1;
}

上面代码中有一个小小的问题,如果left与right之和超过了所在类型的表示范围的话,mid就不会得到正确的值,可能会导致溢出,什么办法会保证代码比较安全呢?我们可以这样定义并初始化:

int mid = left-(left-right)/2;


当然,我们知道表达式除以2就相当于把二进制位右移一位,所以也可以这样来写:

int mid = left-(left-right)>>1;

这样的写法会让效率更高一些