概念介绍
有同学想了解二分查找,今天它来了!二分查找也叫折半查找,查找效率较高。但是它有一个使用前提:待查找的序列必须为有序的,升序或降序都可以。我们来看一下它的核心思想:假设有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,如果发现不足之处,请联系我进行更改,十分感谢!关注我,为你揭秘更多查找算法!