参考:第 2 节 为什么取中间 | 算法吧 (suanfa8.com)
目录
1.在偶数个数字的时候 ,上文代码的写法默认是指向偏左边的数字
2.特别注意 如果出现了left=mid 则需要进行向上取整
二分法的前提:!!!!!有序!!!!!!!!
二分法代码:基本形式[三个区间] while(left<=right)
常见代码是把问题 划分为了三个区间 左 中间 右
//二分查找 常见形式
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
但是对于具体那种情况往往不能够直接判断得出
2.二分查找[划分为2个区间] while(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/
3.while(left + 1<right)
退出循环后具有两个元素,在循环体内对mid处的值进行了判断
如何选取合适的二分法?
1.while条件
1.如果待查找的数据性质简单,我们可以采用3区间的方法
2.如果待查找的数据性质复杂,我们采用2区间的方法 但需要注意是向上取整还是向下取整【使用到left=mid 则上取整】
if()逻辑分支条件
根据具体题目来进行判断,有时从问题的反面出发反而更简单!
例如寻找<= 我们可以if(****>****) else……