数据结构与算法—二分查询

2023-11-01

一、二分查询的概念

二、算法思想

程序的非递归实现

int binaryFind(int* nums, int n,int key)
{
    int left = 0, right = n - 1;
    int mid = 0;
    int pos = -1;
    while (left <= right)
    {
        //mid=(right-left)/2+left;
        //mid=((right-left)>>1)+left;
        mid = (left + right) / 2;
        if (nums[mid] < key)
        {
            left = mid + 1;
        }
        else if(nums[mid]>key)
        {
            right = mid - 1;
        }
        else
        {
            pos = mid;
            break;
        }
    }
    return pos;
}

提问:为什么循环里面使用的是left<=right,而不是left<right呢?原因是left到right表示的是程序的规模,当他们两相等的时候,此时还有一个值没有被查询到。只有当他们错开的时候才全部被查询到。

程序的递归实现:

int binaryFind1(int* nums, int key,int left,int right)
{
    int pos = -1;
    if (left <= right)
    {
        int mid = (left + right) / 2;
        if (nums[mid] < key)
        {
            pos = binaryFind1(nums, key, mid + 1, right);
        }
        else if (nums[mid] > key)
        {
            pos = binaryFind1(nums, key, left, mid - 1);
        }
        else
        {
            pos = mid;
        }
    }
    return pos;
}

二叉查询的问题拓展:

如果数组里面有重复的数据,则返回最左边的数组下标

改法一(线性查询):

int binaryFind(int* nums, int n, int key)
{
    int left = 0, right = n - 1;
    int mid = 0;
    int pos = -1;
    while (left <= right)
    {
        //mid=(right-left)/2+left;
        //mid=((right-left)>>1)+left;
        mid = (left + right) / 2;
        if (nums[mid] < key)
        {
            left = mid + 1;
        }
        else if (nums[mid] > key)
        {
            right = mid - 1;
        }
        else
        {
            while(mid>=left&&nums[mid-1]==key)
            {
                mid--;
            }
            pos = mid;
            break;
        }
    }
    return pos;
}

改法二(二分查询):

int binaryFind(int* nums, int n, int key)
{
    int left = 0, right = n - 1;
    int mid = 0;
    int pos = -1;
    while (left <= right)
    {
        //mid=(right-left)/2+left;
        //mid=((right-left)>>1)+left;
        mid = (left + right) / 2;
        if (nums[mid] < key)
        {
            left = mid + 1;
        }
        else if (nums[mid] > key)
        {
            right = mid - 1;
        }
        else
        {
            if (mid == left || nums[mid - 1] != key)
            {
                pos = mid;
                break;
            }
            else
            {
                right = mid - 1;
            }
        }
    }
    return pos;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数据结构与算法—二分查询 的相关文章

随机推荐

  • 终于解决DELL台式机的风扇噪音变大的问题

    我的这台电脑是今年7月中旬买的 是DELL 的5150 刚到家的时候 几乎没有什么噪音 很安静 我当时还在感叹DELL的降噪音技术做得如此之好 但到九月份的时候 发现噪音有些变大 尤其在运行需大量运算的程序时 我当时也没多想 但发现就算上新
  • Json Path提取器

    一 Json Path提取器截图 二 Json Path提取器使用说明 http响应的Json结果如下图 数据来源 可以是Http请求的响应结果或者JMeter变量值 目标变量名和Json Path表达式 将Json Path提取出的结果存
  • 共享里的文件被删除了怎么办?可尝试这三种恢复方法

    共享里的文件被删除了怎么恢复 删除之后就马上去回收站找 可是没回收站里没有怎么办 来自某xx小伙伴的咨询 如果你也出现同样的疑惑 那么可以尝试下面的三种方法恢复共享里的文件 方法一 以前的版本恢复 从Windows XP SP2和Windo
  • python安装到一半停止_关于python:使用requirements.txt进行安装时,停止单个包上的pip失败...

    我正在安装requirements txt中的包 pip install r requirements txt requirements txt文件显示 Pillow lxml cssselect jieba beautifulsoup n
  • 外设驱动库开发笔记3:AD527x系列数字电位器驱动

    在一些时候我们需要使用精度更高的数字电位器来实现我们的应用 我们经常使用AD527x系列数字电位器来实现这类应用 在通常情况下 AD527x系列数字电位器完全能够满足要求 为了减少重复工作 在这里我们将分系并实现AD527x系列数字电位器的
  • 12月31日写成13月1日引发重大 Bug,程序员新年就要被“祭天”?

    元旦放假 宅家大扫除成了头等大事 这不 小白鲸扫地机器人竟然选择了 罢工 不少用户反馈小白鲸拖地机器人指示灯一直异常无法工作 到底是什么鬼呢 官方排查发现 是的 你没看错 Bug 原因是程序员小哥哥把 12 月 31 日写成了 13 月 1
  • C4.5算法详解(非常仔细)

    首先 C4 5是决策树算法的一种 决策树算法作为一种分类算法 目标就是将具有p维特征的n个样本分到c个类别中去 相当于做一个投影 c f n 将样本经过一种变换赋予一种类别标签 决策树为了达到这一目的 可以把分类的过程表示成一棵树 每次通过
  • VUE报错 plugin-vue requires vue (>=3.2.13) or @vue/compiler-sfc to be present in the dependency tree

    VUE运行报错 vitejs plugin vue requires vue gt 3 2 13 or vue compiler sfc to be present in the dependency tree 运行 npm install
  • [系统安全] 四十九.恶意软件分析 (5)Cape沙箱分析结果Report报告的API序列批量提取详解

    终于忙完初稿 开心地写一篇博客 您可能之前看到过我写的类似文章 为什么还要重复撰写呢 只是想更好地帮助初学者了解病毒逆向分析和系统安全 更加成体系且不破坏之前的系列 因此 我重新开设了这个专栏 准备系统整理和深入学习系统安全 逆向分析和恶意
  • android设置布局高度的属性,Android内部分享[9]——约束布局 ConstraintLayout 的使用...

    ConstraintLayout 允许您创建具有平面视图层次结构 没有嵌套视图组 的大型复杂布局 它类似于 RelativeLayout 因为所有视图都是根据兄弟视图和父视图布局之间的关系来布局的 但是它比 RelativeLayout 更
  • 移动机器人定位(amcl)

    1 定位 amcl 1 1找到amcl自带功能包 amcl diff launch
  • 使用Python调用百度地图的API在地图上添加标记

    写在前面 近期博主工作太忙 快一个月没更新博客 今天跑了大半天的腿 被一堆破事儿弄的无比憋屈 写篇博客调节一下心情 博主的目的是在地图上做一些标记 然后保存为html网页文件 这样方便我的软件调用 前期我使用的folium包 这个包很强大
  • Kylin ext3/4 xfs手动扩容根分区

    1 环境 云平台 兼容OpenStack Queens的发行版 HOST OS Kylin Server 10 SP1 Release Build20 20210518 arm64 虚拟机镜像ISO Kylin Server V10 GFB
  • Flask-模板

    视图函数的作用是生成请求的响应 但是直接在视图函数里处理业务逻辑和表现逻辑 会显的代码混乱 可以把表现逻辑移到模板中 模板是包含响应文本的文件 其中包含用占位变量表示的动态部分 其具体值只在请求的上下文中才能知道 使用真实值替换变量 再返回
  • IT行业相关技术介绍

    IT行业常见技术体系 一 前端开发 前端开发是创建WEB页面 网页 或APP等前端界面呈现给用户的过程 通过HTML CSS JavaScript以及衍生出来各种技术 框架 来实现互联网产品的用户界面交互 1 核心技术 1 HTML 网页的
  • Gitlab详细使用说明

    1 下载安装 下载gitlab和安装就不用详细说了 下载可以到官网下载 官网下载速度慢的 可以到我网盘下载 网盘地址链接 https pan baidu com s 1LZ6wq0PZNyB5SzGAzd74ew 提取码 uccq 2 使用
  • Vant库的使用,及日期组件的一些注意点

    Vant库对于开发商城类项目 真的是非常nice 会让你情不自禁爱上它 Vant库支持按需加载 为移动端商城设计的风格 非常完美 但是 本人在实际开发中 也遇到了一些小问题 折腾了老半天 最终得以解决 下面先说说在vue中使用Vant库的流
  • 小米2022春招内推

    小米2022春招内推 内推码 DSpvRGae 登录小米招聘官网http campus hr xiaomi com 投递简历时填入内推码 或者直接微信扫描下方二维码投递 2022春季补招或2023届实习可投递 岗位类型 研发 产品 设计 运
  • 【Python】Pycharm中The file size exceeds the configured limit 的解决方法

    文章目录 问题描述 解决方案 问题描述 用PyCharm打开较大文件的时候 出现错误提示 The file size 11 42 MB exceeds the configured limit 2 56 MB Code insight fe
  • 数据结构与算法—二分查询

    一 二分查询的概念 二 算法思想 程序的非递归实现 int binaryFind int nums int n int key int left 0 right n 1 int mid 0 int pos 1 while left lt r