前提:
需要一个已经排好序的数组,取出你所需要的那个数n,然后根据二分查找(折半查找进行查询)
原理:第一个数和最后一个数除以二得到中间数m,用中间那个数m和你n进行对比,m>n,将m-1作为右边界值进行再次取中间数,以此类推,最终得到结果。执行代码如下:
package binary;
public class binaryserach {
public static void main(String[] args) {
//定义一个排好序的数组
int[] array={1,6,9,12,18,25,36,48,59,66,75,89,94};
//想要的值
int target=66;
//定义二分查找方法,获取所需值在数组中的位置
int idx=binaryserachs(array,target);
System.out.println(idx);
}
private static int binaryserachs(int[] array, int target) {
//l为左边界,r为右边界,m为中间数
int l=0,r=array.length-1,m;
//如果左边界一直小于有边界,则一直循环
while (l<=r) {
m = (l + r) / 2;
//刚好相等
if (array[m] == target) {
return m;
//m<
} else if (array[m] < target) {
l=m+1;
//m>
}else if (array[m]>target){
r=m-1;
}
}
return -1;
}
}
获取中间值存在的问题,可能会出现中间值溢出现象(也就是超出整形允许范围),下面提供两个解决问题:
1.等式变换:m=l+(r-l)/2,不存在加法运算,不会出现溢出情况
2. l+r>>>1 无符号右移解决溢出,效率大于除法
奇数二分取中间,偶数二分取中间靠左(练习一下,答案都是4)
如果有一个128个数的数组,找到一个数需要多少次?
方法: 求以二为底128的对数,换个数的话就是求那个数的对数