二分查找是基于有序序列的查找算法,该算法一开始令[left,right]为整个序列的下标区间,每次测试当前[left,right]的中间位置mid=(left+right)/2,判断A[mid]与欲查询的元素x的大小。
如果按照严格递增序列:
- 如果A[mid] == x,说明查找成功,退出查询;
- 如果A[mid] > x,说明查询序列在mid左侧,则从左子区间[left,mid]查找;
- 如果A[mid] < x,说明查找序列在mid右侧,则从右子区间[mid+1,right]查找;
int binarySearch(int A[],int left,int right,int x){
int mid;
while(left<=right){
mid = (left+right)/2;
if(A[mid]==x) return mid;
else if(A[mid]>x)
right = mid-1;
else
left = mid+1;
}
return -1; //查找失败,返回-1
}
更近一步问题:如果递增序列A中元素可能重复,那么如何对给定的欲查询元素x:
解:求出序列中第一个大于等于x的元素的位置L以及第一个大于x的元素的位置R,这样元素x在序列中的存在区间就是右闭左开区间[L,R)。