二分法查找 ,只能针对于有序数据进行查找,无序数据无法使用二分法查找。
有序数组:{1,2,3,4,4,5,6,7,7,8} 这个可以使用二分法查找
无序数组:{33,3,45,6,575,76,67,676} 这个无法使用二分法查找
二分法查找规则:
如,查询数组{1,3,4,5,6,7,8,8,43,54,55,77,88,99}中的77所在下标,查找方法为
1、获取下标最小值 0
2、获取下标最大值 array.length-1
3、获取中间的下标,也就是(最小值 +最大值 )/2
4、拿中间下标的值 对比 77,发现中间值 < 77,那么,更改最小值 = 中间值+1,最大值 不变
5、获取中间下标(最小值 +最大值 )/2
6、再次拿数组的中间下标值 对比77,按上叙方法进行对比,依次类推,直到对比完为止
代码如下:
public static void main(String[] args){
int[] array = {1,3,4,5,6,7,8,8,43,54,55,77,88,99};
int index = findIndex(array,99);
System.out.println("查找到值的下标为:"+index);
}
public static int findIndex(int[] array,int num){
//最小值
int min = 0;
//最大值
int max = array.length-1;
//中间下标值
int midd = (max+min)/2;
//用以结束循环,防止死循环
int end = max;
//如果查找的数组不等于数组的中间值,则进行循环
while(num != array[midd]){
//如果数组的中间值大于查找值,则将最大值= 中间下标值-1
if(array[midd] > num){
max = midd-1;
}else{
//如果数组的中间值小于查找值,则将最小值= 中间下标值+1
min = midd+1;
}
//重新获取中间值
midd = (max + min)/2;
//获取结束值 ,因为二分法是取中间值进行对比,相当于除于2,所以结束值也相应除以2
end = end /2;
//如果结束值 等 于0了,说明要查找的值不存在于数组中,没有必须再次循环了,否则,会进入死循环
if(end == 0){
return -1;
}
}
//返回查找到值的下标
return midd;
}
结果:
查找到值的下标为:13