概念介紹
有同學想了解二分查找,今天它來了!二分查找也叫折半查找,查找效率較高。但是它有一個使用前提:待查找的序列必須為有序的,升序或降序都可以。我們來看一下它的核心思想:假設有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,如果發現不足之處,請聯系我進行更改,十分感謝!關注我,為你揭秘更多查找算法!