二分查找詳解


概述

二分查找又稱折半查找,是一種效率較高的查找方法。


使用條件

1.必須滿足順序儲存結構
2.必須滿足元素有序排列
3.必須滿足儲存結構中元素互異


原理

由於數組元素的有序性和互異性,通過下標得到數組內元素間相對的大小關系,定義三個變量:兩個邊界變量確定查找范圍,一個取值兩個邊界變量中間值的中間變量用於同被查找值比較大小、從而改變邊界變量的值進而縮小查找區間的范圍、重新確定中間值,並重復這一過程直到中間值下標等於查找值、最小值下標大於最大值下標,退出循環。


二分查找的流程(正序)

1.使用整型數據數組儲存正序排列互異元素

        int[] arr1 = {1,2,3,4,5,6,7,8,9};

2.獲取查找數據

        //使用Scanner獲取輸入的數據
        Scanner sc = new Scanner(System.in);
        int num = sc.nextInt();

3.定義最大值下標、最小值下標、中間值下標

        //最大值下標
        int maxIndex = arr1.length - 1;

        //最小值下標
        int minIndex = 0;

        //中間值下標
        int midIndex = (maxIndex + minIndex) / 2;

4.因為不確定循環次數所以使用while循環

        while(true){
          //正序排列下,查找數據大於中間值數據
          if(arr1[midIndex] < num){
            //最小值下標 = 中間值下標 + 1
            minIndex = midIndex + 1;
          }
          //正序排列下,查找數據小於中間值數據
          else if(arr1[midIndex] > num){
            //最大值下標 = 中間值下標 - 1;
            maxIndex = midIndex - 1;
          }
          else{
            break;
          }

          //正序條件下,最小值下標大於最大值下標時
          if(minIndex > maxIndex){
            midIndex = -1;
            break;
          }

          //更新中間下標變量
          midIndex = (minIndex + maxIndex) / 2;
        }

        System.out.println(midIndex > 0 ? "找到元素下標為"+midIndex : "找不到該元素!");

初始狀態下的三個坐標變量值固定的,不會隨着查找數據的改變而改變。如圖所示:

執行while循環中的方法體時,我們需要特別注意中間下標值和查找值大小的關系、即不同大小關系對應的執行體,例如:

查找數據為6時,查找值大於中間下標值,最小值下標變量 = 中間值下標變量 + 1,此時三變量下標值關系:

最小下標變量大於最大下標變量關系不成立,最大下標變量加最小下標變量的和除2的商賦值給中間變量,此時三變量下標值關系:

查找值小於中間下標值,最大值下標變量 = 中間值下標變量 - 1,此時三變量下標值關系:

最小值下標變量大於最大值下標變量關系依然不成立,最大下標變量加最小下標變量的和除2的商賦值給中間變量,此時三變量下標值關系:

中間下標值既不大於、也不小於查找值,退出循環。


二分查找的流程(倒序)

流程和正序相同,我們只說不一樣的部分:

1.源數據倒序

        int[] arr2 = {9,8,7,6,5,4,3,2,1};

2.倒序情況下,最大值下標變量、最小值下標變量與正序的賦值相反,中間值的賦值運算不變。


        //最小值下標
        int minIndex = arr2.length - 1;

        //中間值下標
        int midIndex = (maxIndex + minIndex) / 2;

倒序情況下,初始三下標變量的關系如下:

3.倒序情況下,當最大值下標變量大於最小值下標變量時,查找數據不存在,這與正序條件相反。

        if(maxIndex > minIndex){
          midIndex = -1;
          break;
        }

4.倒序情況下,同樣采用while循環,中間下標值和查找值的大小關系條件不變,但不同大小關系對應的方法體與正序的情況不同,舉例說明:

查找數據為6時,查找值大於中間下標值,最小值下標變量 = 中間值下標變量 - 1,此時三變量下標值關系:

最大值下標變量大於最小值下標變量的關系不成立,最大值下標變量加最小值下標變量的和除2的商賦值中間下標變量。此時三變量下標值關系:

查找值大於中間下標值,最大值下標變量 = 中間值下標變量 + 1,此時三變量下標值關系:

最大值下標變量大於最小值下標變量的關系不成立,最大值下標變量加最小值下標變量的和除2的商賦值中間下標變量。此時三變量下標值關系:

查找值仍小於中間下標值,最大值下標變量 = 中間值下標變量 + 1

最大值下標變量大於最小值下標變量的關系不成立,最大值下標變量加最小值下標變量的和除2的商賦值中間下標變量。此時三變量下標值關系:

中間下標值既不大於、不小於查找值時,退出循環。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM