二分查找


概念介紹

  有同學想了解二分查找,今天它來了!二分查找也叫折半查找,查找效率較高。但是它有一個使用前提:待查找的序列必須為有序的,升序或降序都可以。我們來看一下它的核心思想:假設有n個元素的序列升序排列,以中間值arr[n/2]將序列分為兩部分,我們取序列的中間值arr[n/2]與待查找數x比較,如果x<arr[n/2],就在序列的左半部分繼續進行二分查找,如果x>arr[n/2],就在序列的左半部分繼續進行二分查找,退出二分查找的條件為x=arr[n/2]。概念總是太抽象,咱們舉例子來說明。

  需求:在arr=[1,3,5,7,9,10,13,18]中,找到5。

  第一輪查找:中間值為arr[(起始值下標:0+末位置下標:arr.length-1)/2]=arr[(0+8-1)/2]=arr[3],因為5<7,在第一輪中間值左半部分查找,也就是[1,3,5,7,9,10,13,18](紅色序列元素中查找)。

  第二輪查找:找第二輪中間值arr[(起始值下標:0+第一輪中間值下標-1)/2]=arr[(0+3-1)/2]=3,3<5,在第二輪中間值右半部分查找,也就是[1,3,5,7,9,10,13,18](紅色序列元素中查找)。

  第三輪查找:找第三輪中間值arr[(起始值下標:第二輪中間值下標+1+結束下標:第一輪中間值下標-1)/2]=arr[(2+3-1)/2]=5,找到目標值。

代碼實現

  了解了推導過程,實現起來就很容易了,不外乎就是遞歸+中值比較。但是要注意遞歸退出的條件是:起始下標>結束下標,這時候就說明了查找的目標值並不在我們的序列當中。

 1     public static int binarySearch(int[] arr, int start, int end, int findValue) {
 2         if (start > end) {
 3             return -1;
 4         }
 5 
 6         // 獲取中值及其下標
 7         int mid = (start + end) / 2;
 8         int midValue = arr[mid];
 9 
10         // 比較中值:右遞歸的情況
11         if (findValue > midValue) {
12             return binarySearch(arr, mid + 1, end, findValue);
13             // 比較中值:左遞歸的情況
14         } else if (findValue < midValue) {
15             return binarySearch(arr, start, mid - 1, findValue);
16         } else {
17             return mid;
18         }
19     }

   至此,代碼編寫完成,Git地址:https://github.com/HollowCup/algorithms-and-data-structure,具體實現位於algorithm工程下的search目錄BinarySearch,如果發現不足之處,請聯系我進行更改,十分感謝!關注我,為你揭秘更多查找算法!

  


免責聲明!

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



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