二分查找是从已知排序的数组中采用从中间数据与要查找字段比较的方式来比值,已知int整数是32位,二分查找最多也就查找32次就能比较出来结果;
思路:
-
前提:有已排序数组 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 时,表示没有找到,应结束循环
代码
总结:
如图代码所示
● 奇数二分取中间
● 偶数二分取中间靠左(数组长度偶数,如上图长度为14的数组,第一次取值13/2,取值m为6)
● m = (l+r) >>> 1(右位移),边界值整数最大值22亿加上10亿,超出整数取值范围,计算值为负值(二进制超出范围的计算,符号位被进位变成负值了)