编写二分查找代码
- 1.前提:有已排序数组 A(假设已经做好)
- 2.定义左边界 L、右边界R,确定搜索范围,循环执行二分查找 (3、4两步)
- 3.获取中间索引 M= Floor((L+R)/2)
- 4.中间索引的值 AIMI与待搜索的值T进行比较
- A[M]==T 表示找到,返回中间索引
- A[M]>T,中间值右侧的其它元素都大于,无需比较,中间索引左边去找,M -1设置为右边界,重新查找
- A[M]<T,中间值左侧的其它元素都小于T,无需比较,中间索引右边去找,M+1设置为左边界,重新查找
- 5.当L>R时,表示没有找到,应结束循环
public class BinarySearch {
public static void main(String[] args) {
// 1.定义一个按顺序排序的数组
int[] a = {1,8,10,15,17,19,25,29,64,100,182,200};
int target = 17;
System.out.println(binarySearch(a, target));
}
// 二分查找方法,找到元素所在索引
public static int binarySearch(int[] a, int i){
// 定义 左边界,右边界
int l = 0;
int r = a.length - 1;
while (l <= r) {
// 找到中间位置的索引位置
int m = (l + r) / 2;
if(a[m] == i) {
return m;
} else if (a[m] > i) {
r = m - 1;
} else if (a[m] < i) {
l = m + 1;
}
}
return -1;
}
}
mid值溢出问题
在上诉方法中求mid值得时候,可能会造成 mid值溢出,从而导致最后的结果是负数。
解决方案1:
m = (l + r) / 2 ====> m = (l / 2) + (r / 2) =======> m = l + ( -l / 2 + r / 2) =====> m = l + (r - l)/2;
解决方案2:
位运算 也是防溢出 无符号位元素符的优先级较低,所以括起来
m = (l + r) >>> 1