二分法查找是定义最小值和最大值,还有一个中间值。将得到的数字与中间数比较,如果大于中间数,把最小值改成中间值加1,如果小于最小值,就把最大值改成中间值减1.
假设中间值为mid,最大值为max,最小值为min,要找的值为find。
假设find > mid -----------> min = mid +1;
find < mid -------->max = mid - 1;
代码如下:class HalfSearch {
public static void main(String[] args) {
int[] arr = {12, 34, 56, 78, 90, 110, 119, 120, 911, 1024};//定义一个数组,用Scannery定义也可以,最后用for循环对数组中的数字进行赋值。
int index = search(arr, 90);//此处的90是我们要找的数字。search是函数用int 定义一个变量进行接收。
System.out.println(index);//打印出查找数字的下标
}
public static int search(int[] arr, int find) {
//参数合法性判断
if (arr == null || arr.length == 0) {
System.out.println("Input Param is invalid!");
return -1; //表示函数运行失败
}
int mid = 0;
int indexMin = 0;
int indexMax = arr.length - 1;
mid = (indexMax + indexMin) / 2;
while (arr[mid] != find) {
if (arr[mid] < find) {
indexMin = mid + 1;
} else if (arr[mid] > find) {
indexMax = mid - 1;
}//当中间值不等于find时,进入while循环,将最大值和最小值进行对比,更改最值。
if (indexMin > indexMax) {
mid = -1;
break;
}//此处是没有找到数字的返回值因为数组下标应该是大于0的数字
if (arr[mid] == 78) {
System.out.println("找到了~~" + mid);
}//查找的时候认为3种情况,一查找的数就是中间值,二不是中间值,以及三不在数组中,此处的情况值查找的数就是数组的中间数。
mid = (indexMax + indexMin) / 2;//查找一次之后进行的再一次取中间值。否则进行一次还是原来的条件,造成死循环。
}
return mid;
}
}
以下为推导过程,(没有找到值得推理)简而言之为数大中间值加1作为最小值,数小中间值减1作为最大值。
/*
12, 34, 56, 78, 90, 110, 119, 120, 911, 1024
118
0 9 4
indexMin = 5;
indexMax = 9; 7;
indexMax = 6;
indexMin = 5; //5
indexMin = 6;
indexMax = 6; //6
indexMax = 5;
indexMin = 6;
表示没有找到
推理过程
*/