1.算法描述
1.1、前提:已有排序数组A(假设已经做好)。
1.2、定义左边界L、右边界R、确定搜索范围,循环执行二分查找
1.3、获取中间索引M=Floor((L+R) / 2)
1.4、中间索引的值 A[M] 与待搜索的值 T 进行比较
① A[M] == T 表示找到,返回中间索引
② A[M] > T,中间值右侧的其它元素都大于 T,无需比较,中间索引左边去找,M - 1设置为右边界,重新查找
③ A[M] < T,中间值左侧的其它元素都小于 T,无需比较,中间索引右边去找, M + 1设置为左边界,重新查找。
1.5、当 L > R 时,表示没有找到,应结束循环
2.代码实现
public class Main {
public static void main(String[] args) {
int[] array = {1, 5, 8, 11, 19, 22, 31, 35, 40, 45, 48, 49, 50};
int target = 11;
int idx = binarySearch(array, target);
System.out.println(idx);
}
public static int binarySearch(int[] a,int t){
int l = 0,r=a.length -1,m;
while (l<=r){
m = (l + r)/2;
if(a[m] == t){
return m;
}else if(a[m] > t){
r = m - 1;
}else{
l = m + 1;
}
}
return -1;
}
}
3.解决整数溢出问题
当 l 和 r 都较大时,l + r
有可能超过整数范围,造成运算错误
int m = l + (r - l) / 2;
4.其它考法
4.1、使用二分法在序列 1,4,6,7,15,33,39,50,64,78,75,81,89,96 中查找元素 81 时,需要经过( )次比较
4.2、代码实现,(奇数二分取中间,偶数二分取中间靠左)
public class Main {
public static void main(String[] args) {
int[] array = {1,4,6,7,15,33,39,50,64,78,75,81,89,96};
int target = 81;
int idx = binarySearch(array, target);
System.out.println(idx);
}
public static int binarySearch(int[] a,int t){
int l = 0,r=a.length -1,m,n=0;
while (l<=r){
n++;
m = (l + r)/2;
if(a[m] == t){
return n;
}else if(a[m] > t){
r = m - 1;
}else{
l = m + 1;
}
}
return -1;
}
}