定义
对于区间[a,b]上连续不断且f(a)·f(b)<0的函数y=f(x),通过不断地把函数f(x)的零点所在的区间一分为二,使区间的两个端点逐步逼近零点,进而得到零点近似值的方法叫二分法
算法:当数据量很大适宜采用该方法。采用二分法查找时,数据需是排好序的。
基本思想:假设数据是按升序排序的,对于给定值key,从序列的中间位置k开始比较,
如果当前位置arr[k]值等于key,则查找成功;
若key小于当前位置值arr[k],则在数列的前半段中查找
若key大于当前位置值arr[k],则在数列的后半段中继续查找
直到找到为止,,时间复杂度:O(log(n))
int low = 0;
int high = A.size() - 1;
while( low < high )
{
int mid = (low + high)/2;
if( A[mid] < K )
low = mid + 1;
else if( A[mid] > k )
high = mid - 1;
else
return mid;
}
return -1; /*返回-1表示数组不存在K的值*/
}
二分查找易错的地方
1循环退出的条件
注意是low <= high,而不是low<high.
2mid的取值
如果写成 mid (low+high)/2是有问题,如果low和high比较大,两者的和可能会溢出改进的方案low+(high-low)/2,但是计算机位运算比除法快,故可改成low+((high-low)>>1)
感谢观看