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("mid=" + mid +"========"+ "find="+ arr[mid]);                
            }else{
                System.out.println(-low - 1);    //如果没找到,那肯定是低位大于了高位,且低位和高位相挨着,返回没有找到的find值应该所在的下标位置(即-low - 1)
            }
    }
}

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM