二分查找

概念介绍

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

  

posted @ 2019-10-15 23:47  一马关月  阅读(852)  评论(0编辑  收藏  举报