• 二分查找


    概念介绍

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

      

  • 相关阅读:
    Object Modeling
    数据库的比较
    关系数据库与非关系数据库
    结构化查询语言-SQL
    SQLite
    acid (数据库事务正确执行的四个基本要素的缩写)
    UITableView设计思想 考察
    复杂软件的考虑点与UITableView
    设计模式与哲学
    复杂对象的组装与创建-建造者模式
  • 原文地址:https://www.cnblogs.com/maguanyue/p/11675567.html
Copyright © 2020-2023  润新知