java 二分法查找原理

二分法查找原理:

      1、只要低位下标不大于高位下标,就进行二分查找(步骤1-3)

      2、先在有序的数组中对半查找中间的坐标,如果中标和要查找的下标相等时,找到目标数,那二分结束。

      3、如果步骤2没有找到,那就会出现先2种情况:a、中标大于find值;b、中标小于find值;

        3.1、如果中标大于find值,说明find值在中标的左边,那么高位就是此时的中标,然后继续二分

        3.2、如果中标小于find值,说明find值在中标的右边,那么低位就是此时的中标,然后继续二分

      4、如果低位下标大于高位下标:那就是没有这个想要查找的find值,且低位和高位一定是相挨着(类似:low[4],high[3],返回-5)。返回此find值本应插入的 负下标-1即:-low - 1

二分法查找缺点:

      1、数组必须是有序的数组。

   

二分法查找的优点:

      1、查找次数少,效率高。

案例:

import java.util.Arrays;

public class TestBinarySearch {
    public static void main(String[] args) {
        int [] arr={5,13,19,21,37,56,64,75,80,88,92};    //数组必须是有序的
        
        int low = 0;    //低位
        int high = arr.length;    //高位
        int mid = 0;    //可以随便给中位赋值下标
        
        int find = 37;    //查找值
        
        boolean flag = false;
        
        while(low <= high){        //只要高位边不比低位小,就继续二分
            mid = (low + high)/2;    //二分后有三种情况:中位比find值大;中位比find值小;中位和find值相等
            
            if(arr[mid] > find){    //二分之后中位比find值大,说明find值在中位的右边,那么高位就是此时的中位,然后继续二分
                high = mid - 1;
                
            }else if(arr[mid] < find){    //二分后中位比find值小,说明find值在中位的左边,那么低位就是此时的中位,然后继续二分
                low = mid + 1;
            }else{                        //当中位和find值相等时,找到find值所对应的下标,二分结束
                flag = true;
                System.out.println(mid);
                break;
            }
            
        }
        
        if(flag){                
                System.out.println("m> arr[mid]);                
            }else{
                System.out.println(-low - 1);    //如果没找到,那肯定是低位大于了高位,且低位和高位相挨着,返回没有找到的find值应该所在的下标位置(即-low - 1)
            }
    }
}