二分查找——出现溢出问题
算法描述:
前提:有已排序数组 A(假设已经做好)
定义左边界 L、右边界 R,确定搜索范围,循环执行二分查找(3、4两步)
获取中间索引 M = Floor((L+R) /2)
中间索引的值 A[M] 与待搜索的值 T 进行比较
① A[M] == T 表示找到,返回中间索引
② A[M] > T,中间值右侧的其它元素都大于 T,无需比较,中间索引左边去找,M - 1 设置为右边界,重新查找
③ A[M] < T,中间值左侧的其它元素都小于 T,无需比较,中间索引右边去找, M + 1 设置为左边界,重新查找
当 L > R 时,表示没有找到,应结束循环
代码实现:
public class BinarySearch {
public static void main(String[] args) {
int[] array = {1, 5, 8, 11, 19, 22, 31, 35, 40, 45, 48, 49, 50};
int target = 48;
int idx = binarySearch01(array, target);
System.out.println(idx);
}
/**
* 1. 前提:有已排序数组 A(假设已经做好)
* 2. 定义左边界 L、右边界 R,确定搜索范围,循环执行二分查找(3、4两步)
* 3. 获取中间索引 M = Floor((L+R) /2)
* 4. 中间索引的值 A[M] 与待搜索的值 T 进行比较
* ① A[M] == T 表示找到,返回中间索引
* ② A[M] > T,中间值右侧的其它元素都大于 T,无需比较,中间索引左边去找,M - 1 设置为右边界,重新查找
* ③ A[M] < T,中间值左侧的其它元素都小于 T,无需比较,中间索引右边去找, M + 1 设置为左边界,重新查找
* 5. 当 L > R 时,表示没有找到,应结束循环
*
* @param array
* @param target
* @return
*/
private static int binarySearch01(int[] array, int target) {
int L = 0, R = array.length - 1, M;
while (L <= R) {
M = (L + R) / 2;
if (array[M] == target) {
return M;
} else if (array[M] > target) {
R = M - 1;
} else {
L = M + 1;
}
}
return -1;
}
}
出现整数溢出实例:
假设a为左边界索引,b为右边界索引,且为整数最大值-1,c为中间索引
int a = 0;
int b = Integer.MAX_VALUE-1;
int c = (a+b)/2;
// 假设目标值在中间索引的右边
// 重新设置中间索引,此时出现整数溢出
c = (c+1+b)/2;
System.out.println(c);
打印出c的值为:-536870913
解决溢出:
方法一:
将 M = (L + R) / 2; 将改成:M = L+(R-L)/2;
方法二:
M = (L + R) / 2;
根据位运算可以改写成:
M = (L + R) >>>1
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY