参考:第 2 节 为什么取中间 | 算法吧 (suanfa8.com)
目录
1.在偶数个数字的时候 ,上文代码的写法默认是指向偏左边的数字
2.特别注意 如果出现了left==mid 则需要进行向上取整
二分法的前提:!!!!!有序!!!!!!!!
常见代码是把问题 划分为了三个区间 左 中间 右
//二分查找 常见形式
public int binsearch(int[] a,int k) {
int left=0;
int right=a.length-1;
while(left<=right) {//搜索区间不为空
int mid=left+((right-left)>>1);
if(a[mid]>k) {
left=mid+1;
}else if(a[mid]<k){
right=mid-1;
}else {
return mid;
}
}
return -1;
}
1.在偶数个数字的时候 ,上文代码的写法默认是指向偏左边的数字
也可以按照下图修改成指向偏右的数字. int mid =(left+right+1)/2
2.退出循环的条件
在此常规代码当中退出循环无非两种条件:
- right左移一位小于left
- left右移一位大于right
但是对于具体那种情况往往不能够直接判断得出
划分为两个区间:1.包含待查找元素的区间 2.不包含待查找元素的区间
//二分查找
public int binsearch(int[] a,int k) {
int left=0;
int right=a.length-1;
while(left<right) {//搜索区间不为空
int mid=left+((right+left)>>1);
if(a[mid]<k) {
left=mid+1;
}else {
//a[mid]>=k 即mid处的值可能为目标值
right=mid;
}
}
//退出循环的条件只有一种 left=right
//我们只需单独判断 left=right时的值,是否为我们所需即可
if(a[left]==k) {
return left;
}
return -1;
}
1.退出循环的条件
退出循环的条件为:left==right
我们只需单独判断left==right的时候的值是否是我们所需即可
2.特别注意 如果出现了left==mid 则需要进行向上取整
https://suanfa8.com/binary-search/videos/04/