首页 > 其他分享 >二分查找

二分查找

时间:2023-01-06 18:46:54浏览次数:32  
标签:二分 arr target int mid 查找 low

一、二分查找核心

1)二分查找的原理

二分查找(Binary search)也称折半查找,是一种效率较高的查找方法。

  1.  设置查找区间:low = 0;high= n;
  2. 若low > high时仍未找到,则查找失败;否则转步骤3
  3. 取中间位mid = (low + high) / 2;比较 target 与 arr[mid]
  4. 若 target < arr[mid],则high = mid - 1;查找在左半区间进行,转步骤2
  5. 若 target > arr[mid],则low = mid + 1;查找在右半区间进行,转步骤2
  6. 若 target = arr[mid],则查找成功,返回 mid 值

2)二分查找需要满足以下条件

  1. 要求线性表中的记录必须按关键码有序
  2. 链表必须按顺序存储

3)简单示例

从一个数列中找到数字37

二分查找

通过二分查找与顺序查找演示对比,可以看出 二分查找 在查找数字 37 时只需3次,而 顺序查找 在查找37时需要12次

4)时间复杂度

二分查找最好时间复杂度是:最好情况下只需要进行1次比较就能找到目标元素

二分查找最坏时间复杂度是:最坏情况就是查找不到目标元素

二分查找平均时间复杂度是


 

二、代码

1)非递归写法

    public int BinarySearch(int[] arr, int len, int target) {
        int low = 0;
        int high = len;
        int mid;
        while (low <= high) {
            mid = (low + high) / 2;
            if (target < arr[mid]) high = mid - 1;
            else if (target > arr[mid]) low = mid + 1;
            else return mid;
        }
        return -1;
    }

2)递归写法

    public int BinarySearch(int[] arr, int low, int high, int target) {
        if (low > high) {
            return -1;
        } else {
            int mid = (low + high) / 2;
            if (target < arr[mid]) return BinarySearch(arr, low, mid - 1, target);
            else if (target > arr[mid]) return BinarySearch(arr, mid + 1, high, target);
            else return mid;
        }
    }

标签:二分,arr,target,int,mid,查找,low
From: https://www.cnblogs.com/not2/p/17031339.html

相关文章

  • 算法—查找三数相加为零的三元组
    packagealgorithm;importjava.util.ArrayList;importjava.util.Arrays;importjava.util.List;/***给定一个包含n个整数的数组nums,判断nums中是否存在三个元素a,b......
  • 查找所有树的直径都经过的边的数量
    P3304目录大体思路code此题思路上跟https://www.cnblogs.com/kingbuffalo/p/17027323.html上的思路差不多。目录大体思路第一遍dfs找到最远点第二遍dfs找到直......
  • Unity中使用GameObject.Find、Transform.Find查找GameObject
    ​GameObjectFindTransformFind查找游戏对象​​​前置条件​​​相关API​​​1GameObjectFind​​​​2TransformFind​​​​3其他查找​​​​实际测试​​​​即使......
  • BST查找结构与折半查找方法的实现与实验比较
    简介作业:查找结构与排序方法作业题目:BST查找结构与折半查找方法的实现与实验比较要求编写程序实现BST存储结构的建立(插入)、删除、查找和排序算法;实现折半查找算法......
  • 蓝桥杯——查找的妙趣
    一、查找1.1递归式二分查找作为查找的必学算法,二分查找大家一定不陌生,通过前面我们所学的递归,那么我们继续强化递归思想,将二分查找转换成递归的方式。任何循环都能改......
  • 一个查找mysql数据库无主键表的脚本
    说明:遍历所有的库表然后查询是否具有主键/bin/bashdb_host=172.19.211.2#dbipdb_name_list="chimessoxrayintcommpultus"#填写db_name支持多个数据库,以空格隔......
  • c++ 查找目录下的子目录及文件
    c++读取指定目录下的所有目录名称+文件名称-远征i-博客园(cnblogs.com) 文件句柄的类型long如果不行试试longlong 另外:使用了批处理,这篇很好CMD批处理循环......
  • Java8中比较器和收集器的常用示例-排序、流转集合、分组、分区、查找最大最小值
    场景Java8新特性-Stream对集合进行操作的常用API:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/126070657前面讲Stream的常用api。下面讲比较器和收集器......
  • MongoDB时间范围查找
    1.查询时间范围,且模糊匹配message列中含“api”字符串的记录db.collection_fee.find({'time':{$gte:ISODate("2023-01-05T09:58:51.122Z"),$lte:ISODate("2......
  • 查找php-fpm
    [root@VM-4-6-centos/]#find/-namephp-fpm/opt/remi/php74/root/usr/sbin/php-fpm/etc/opt/remi/php74/sysconfig/php-fpm/var/opt/remi/php74/log/php-fpm/var/opt/r......