轻松拿捏C语言——二分查找

news2024/10/7 8:23:35

🥰欢迎关注 轻松拿捏C语言系列,来和 小哇 一起进步!✊

🌈感谢大家的阅读、点赞、收藏和关注💕


目录🎉

 一、介绍🌈

二、步骤🌙

三、代码☀️


 

 一、介绍

二分查找是一种在有序数组中查找某一特定元素的搜索算法。

举个生活中的例子,当我们要去图书馆借书时,知道了要找的图书编号,我们可以在一个大致范围的中间查找,然后在决定往前找还是往后找。这样就能比一本一本地找更加快速。

搜索过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束;

如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。

如果在某一步骤数组为空,则代表找不到。这种搜索算法每一次比较都使搜索范围缩小一半。

二、步骤

  1. 确定搜索范围,即数组的下标范围left和right。
  2. 计算中间元素的下标mid = (left + right) / 2(注意整数除法)。

        但是像这样求平均值,如果数字太大了超过int类型能表示的最大范围,这种算法就会有问题,整数会溢出。

        所以我们可以换一个思路,把两数的差值的一半 加到另一个数字中:

        mid = left + (right-left) /2 

  1. 判断中间元素与目标值的大小关系。
    • 如果相等,则返回中间元素的下标。
    • 如果目标值小于中间元素,则在左半部分继续搜索(right = mid - 1)。
    • 如果目标值大于中间元素,则在右半部分继续搜索(left = mid + 1)。
    • 如果搜索范围left大于right,则表示数组中没有目标值,返回-1或其他表示未找到的值。

三、代码

法一:用递归实现

#include <stdio.h>  
  
int Sort(int arr[], int left, int right, int Key) {  
    if (left > right) 
        return -1; // 搜索范围无效  
    int mid = left + (right - left) / 2;  //这种写法可避免溢出
    if (arr[mid] == Key) 
    {  
        return mid; // 找到目标,返回下标  
    } 
    else if (arr[mid] > Key) 
    {  
        return Sort(arr, left, mid - 1, Key); // 在左半部分继续搜索  
    } 
    else 
    {  
        return Sort(arr, mid + 1, right, Key); // 在右半部分继续搜索  
    }  
}  
  
int main() {  
    int arr[] = {1, 3, 5, 7, 9};  
    int key = 5;  
    int n = sizeof(arr) / sizeof(arr[0]);  
    int ret = Sort(arr, 0, n - 1, key);  
    if (ret != -1) 
    {  
        printf("元素 %d 在数组中的下标为 %d\n", key, ret);  
    } 
    else 
    {  
        printf("元素 %d 不在数组中\n",key);  
    }  
    return 0;  
}

法二:用循环实现

#include <stdio.h>  
  
int Sort(int arr[], int N, int Key) 
{  
    int left = 0;
    int right = N - 1;  
    while (left <= right) 
    {  
        int mid = left + (right - left) / 2;  
        if (arr[mid] == Key) 
        {  
            return mid;  
        } 
        else if (arr[mid] > Key)
        {  
            right = mid - 1;  
        }
        else
        {  
            left = mid + 1;  
        }  
    }  
    return -1; // 未找到目标值  
}  
  
int main()
{  
    int arr[] = {1, 3, 5, 7, 9};  
    int key = 5;  
    int n = sizeof(arr) / sizeof(arr[0]);  
    int ret = Sort(arr, n, key);  
    if (ret != -1) 
    {  
        printf("元素 %d 在数组中的下标为 %d\n", key, ret);  
    } 
    else 
    {  
        printf("元素 %d 不在数组中\n",key);  
    }  
    return 0;   
}

使用循环的方式来实现二分查找,更直观且易于理解。

不过,递归的方式在某些情况下可能更简洁。

无论使用哪种方式,都需要确保数组是有序的,因为二分查找的前提是有序数组。 


 

 🎉🎉🎉本文内容结束啦,希望各位大佬多多指教!

🌹🌹感谢大家三连支持

💕敬请期待下篇文章吧~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1707315.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

DINO中为什么教师模型用大图,学生模型用小图

在 DINO&#xff08;可以理解为由DIstillation和NO labels的缩写&#xff09;中&#xff0c;使用不同的图像裁剪策略对教师模型和学生模型进行训练有其特定的原因。具体来说&#xff0c;教师模型使用大图&#xff08;global views&#xff09;&#xff0c;学生模型则同时使用大…

二十三篇:未来数据库革新:AI与云原生的融合之旅

未来数据库革新&#xff1a;AI与云原生的融合之旅 1. 智能数据库管理&#xff1a;AI的魔法 在数字化时代&#xff0c;数据库技术作为信息管理的核心&#xff0c;正经历着前所未有的变革。AI&#xff08;人工智能&#xff09;和云原生技术的融合&#xff0c;正在重新定义数据库…

Dubbo生态之深度分析sentinel的流量控制

1. 深度了解sentinel限流规则参数的含义 博客Dubbo生态之sentinel限流-CSDN博客中有dubbo集成sentinel的demo演示 在sentinel中&#xff0c;限流的直接表现形式就是&#xff0c;在执行Entry nodeA SphU.entry(resourceName)的时候抛出FlowException异常&#xff0c;FlowExce…

元宇宙vr科普馆场景制作引领行业潮流

在这个数字化高速发展的时代&#xff0c;北京3D元宇宙场景在线制作以其独特的优势&#xff0c;成为了行业内的创新引领者。它能够快速完成空间设计&#xff0c;根据您的个性化需求&#xff0c;轻松设置布局、灯光、音效以及互动元素等&#xff0c;为您打造出一个更加真实、丰富…

su模型导进3D无法炸开和移动?---模大狮模型网

SketchUp(简称SU)作为一款广受欢迎的3D建模软件&#xff0c;其直观的操作界面和丰富的功能深受用户喜爱。然而&#xff0c;当我们将SU模型导入到其他3D软件(如3ds Max、Maya等)时&#xff0c;有时会遇到模型无法炸开(即分解)和移动的问题。这不仅影响了我们的工作效率&#xff…

Mesa GL Dispatch分发分析与理解

Mesa GL Dispatch分发分析与理解 引言 这篇博客的核心是从OpenGL应用程序的典型api入手&#xff0c;分析gl api 调用到用户态驱动后端的过程&#xff0c;进而总结出一个典型的调用栈。理解了这个典型调用栈&#xff0c;对后续任何一个API的调用过程分析&#xff0c;都是a piec…

618有哪些值得买的好物?这几款好物通宵整理吐血推荐!

随着618购物节越来越近&#xff0c;很多买家终于等到了用好价钱买好东西的好机会。不管是你一直想要的家居电器&#xff0c;还是最新的数码产品&#xff0c;平时挺贵的东西在618期间会便宜不少。不过&#xff0c;这么多东西可选&#xff0c;促销活动也多得让人看花了眼&#xf…

实现echarts多图联动效果

实现echarts多图联动效果 文章目录 实现echarts多图联动效果业务场景实现关键api代码示例&#xff08;vue&#xff09; 业务场景 提示&#xff1a;主要是记录一下多个echarts联动效果实现方案 这本来就是echarts本身自带的api&#xff0c;并没有多高级&#xff0c;奈何寻找的过…

VUE3学习第一篇:启动ruoyi

1、找到ruoyi的vue3版本 然后下载代码到本地&#xff0c; 我刚开始用的nodejs14报错&#xff0c; 后面换成nodejs16&#xff0c;启动前端成功了。 页面如下图所示

用大模型搭建一个自己的新闻小助手

背景 信息快速增长的时代&#xff0c;及时获取到有价值的资讯是一件很必要的事情。已经有各类新闻app和获取信息的渠道了&#xff0c;为什么还需要在构建一个小助手来获取新闻资讯呢&#xff1f;其实原因很简单各类新闻app服务的是具体一类人群&#xff0c;个人和人群还是有偏…

GPT-4o和GPT-4有什么区别?我们还需要付费开通GPT-4?

GPT-4o 是 OpenAI 最新推出的大模型&#xff0c;有它的独特之处。那么GPT-4o 与 GPT-4 之间的主要区别具体有哪些呢&#xff1f;今天我们就来聊聊这个问题。 目前来看&#xff0c;主要是下面几个差异。 响应速度 GPT-4o 的一个显著优势是其处理速度。它能够更快地回应用户的查…

13 VUE学习:组件v-model

基本用法 v-model 可以在组件上使用以实现双向绑定。 从 Vue 3.4 开始&#xff0c;推荐的实现方式是使用 [defineModel()]宏&#xff1a; <!-- Child.vue --> <script setup> const model defineModel()function update() {model.value } </script><te…

还在使用Swagger吗?ApifoxHelper插件隆重登场

目录 前言 安装Apifox Idea插件安装 插件令牌配置 获取令牌 Idea配置令牌 快速上手 同步文档 查看文档 结语&#xff1a; 前言 最近发现一款特别好用的插件&#xff0c;帮助开发者快速生成接口文档。ApifoxHelper插件实现代码零侵入&#xff0c;只需要写上相应注释即可…

切勿安装这五款流氓软件,你中招了没

流氓软件&#xff0c;又称为恶意软件&#xff0c;是一类设计用来损害用户设备、窃取信息或干扰正常使用的程序。以下是五款臭名昭著的流氓软件介绍&#xff0c;提醒切勿安装&#xff0c;只能说一个比一个毒&#xff0c;你中招了没 可以去去虚拟机试试谁的毒更强一些&#xff0…

信息化教推动数字化学校建设

在数字化学校建造的过程中&#xff0c;许多学校都疏忽了运用这些网络科技渠道的教师和学生&#xff0c;一味的追求学校数字化、智能化建造&#xff0c;没有从根本上意识到教育信息化的出现者或者说体现者的重要性&#xff0c;因而&#xff0c;建造数字化学校&#xff0c;前进教…

Genzai:一款针对物联网安全的多功能实用性工具套件

关于Genzai Genzai是一款针对物联网安全的多功能实用性工具套件&#xff0c;该工具旨在识别与物联网相关的仪表盘&#xff0c;并扫描它们以查找默认密码和安全问题&#xff0c;广大研究人员可以使用该工具来检测和提升物联网设备的安全性。 Genzai支持用户以输入的形式提供一个…

【RK3288 Android10 T8pro usb hid-multitouch idc配置】

【RK3288 Android10 T8pro usb hid-multitouch idc配置】 文章目录 【RK3288 Android10 T8pro usb hid-multitouch idc配置】背景代码分析1. 读取配置文件2. 标志内外置屏幕3. 设置输入设备4. findviewport()5. 根据对应的viewport来计算相应的mapping的参数 结论 背景 T8pro …

C#中的事件聚合器实现方法

概述&#xff1a;_对象之间的关系_是使代码库难以理解和难以维护的原因。为了更好地理解它&#xff0c;我们求助于马丁福勒&#xff08;Martin Fowler&#xff09;&#xff1a;事件聚合器是间接的简单元素。在最简单的形式中&#xff0c;您可以让它注册到您感兴趣的所有源对象&…

JAVA智慧工厂制造生产管理MES系统,全套源码,多端展示(MES与ERP系统的区别和联系)

MES与ERP系统的区别和联系 MES制造执行系统&#xff0c;是一套面向制造公司车间执行层的生产信息化管理系统。MES 可觉得公司提供涉及制造数据管理、计划排产管理、生产调度管理、库存管理、质量管理、人力资源管理、工作中心、设备管理、工具工装管理、采购管理、成本管理、项…

C++牛客周赛43题目分享(3)小红平分糖果,小红的完全平方数,小苯的字符串变化,小红的子数组排列判断

目录 ​编辑 1.前言 2.四道题目 2.1小红平分糖果 2.1.1题目描述 2.1.2输入描述 2.1.3输出描述 2.1.4示例 2.1.5代码 2.2小红的完全平方数 2.1.1题目描述 2.1.2输入描述 2.1.3输出描述 2.1.4示例 2.1.5代码 2.3小苯的字符串变化 2.1.1题目描述 2.1.2输入描述 …