使用条件
无重复 的 有序 数组
算法思想
将表中间位置记录(mid)与查找关键字(target)比较,如果两者相等,则查找成功;否则利用中间位置记录(mid)将表分成前、后两个子表,如果查找关键字(target)小于中间位置记录(mid)的关键字,则进一步查找前一子表,否则进一步查找后一子表。
重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。
难点分析
对于二分查找算法,入手点和难点在于搜索区间的确定,常规来讲主要分为两类
- 左闭右闭 区间
- 左闭右开 区间。
左闭右闭区间
由于搜索区间两端闭合,即左右区间两端都可以取到值。因此有,
high = nums.size()-1while(low<=high)if(target<nums[mid]) high = mid-1;if(target>nums[mid]) low = mid+1;
左闭右开区间
由于搜索区间左端闭合右端开口,即左端点可以取到搜索值,而右端点无法取到搜索值。若想使得区间包涵所有搜索值,左端点要取搜索区间第一个值,而右端点应该取最搜索区间最后一个值的下一个。因此有,
-
high = nums.size() -
while(low<high) -
if(target<nums[mid]) high = mid;
此时目标值target小于mid所指位置,且mid所指值不是目标值,应查找mid之前的子表,而且在左闭右开区间条件下,右端点high指向搜索区间最后一个值的下一个值,因此high指向mid. -
if(target>nums[mid]) low = mid+1;