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