二分法查找

二分法查找是定义最小值和最大值,还有一个中间值。将得到的数字与中间数比较,如果大于中间数,把最小值改成中间值加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; 
     表示没有找到
     推理过程
    */

你可能感兴趣的:(二分法查找)