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

🥰欢迎关注 轻松拿捏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;   
}

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

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

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


 

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

🌹🌹感谢大家三连支持

💕敬请期待下篇文章吧~

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

小程序丨公告栏功能,自动弹出提醒

发布查询时&#xff0c;您是否遇到这样的困扰&#xff1a; 1、查询发布时间未到&#xff0c;学生进入查询主页后发现未发布任何查询&#xff0c;不断咨询原因。 2、有些重要事项需要进入查询主页就进行强提醒&#xff0c;确保人人可见&#xff0c;用户需要反馈“我知道了”才…

Day48 Javascript详解

Day48 Javascript详解 文章目录 Day48 Javascript详解一、什么是javascript二、javascript特点三、 Javascript的历史四、Javascript vs Java五、JS的基本数据类型六、JS基本数据类型的特殊点七、数组 一、什么是javascript JavaScript是一种高级的、解释型的编程语言&#xf…

ST-SLAS Technology 实验室自动化与筛查学会技术

文章目录 一、期刊简介二、征稿信息三、期刊表现四、投稿须知五、出版支持 一、期刊简介 SLAS Technology ——SLAS技术强调促进和改进生命科学研发的科学和技术进步;药物递送;诊断;生物医学和分子成像&#xff1b;以及个性化和精准医疗。这包括高通量和其他实验室自动化技术;…

eclipse配置JDK和Tomcat

eclipse配置JDK jdk配置 配置JDK&#xff1a; 首先&#xff0c;确保JDK已经安装并配置了环境变量。这包括设置JAVA_HOME环境变量&#xff0c;指向JDK的安装目录&#xff0c;以及更新CLASSPATH和PATH环境变量以包含JDK的bin目录。 在Eclipse中&#xff0c;通过Window > Pre…

EFuzz:基于程序环境的通用模糊测试工具

关于EFuzz EFuzz是一款功能强大的模糊测试工具&#xff0c;该工具支持基于程序运行环境来执行模糊测试&#xff0c;广大安全研究人员可以使用该工具对几乎任何程序组件执行安全模糊测试。 该工具在运行之后&#xff0c;会将所有的环境交互信息&#xff08;包括用户输入数据&am…

Linux —— 信号量

Linux —— 信号量 什么是信号量P操作&#xff08;Wait操作&#xff09;V操作&#xff08;Signal操作&#xff09;信号量的类型 一些接口POSIX 信号量接口&#xff1a;其他相关命令&#xff1a; 基于循环队列的生产者和消费者模型同步关系 多生产多消费 我们今天接着来学习信号…

软考--软件设计师-刷题总结

一、数据结构 贪心算法 归并排序将问题先分解、再处理、再合并的方式采用了分治法的思想 分治法&#xff1a;将一个大问题分成若干个小问题 希尔排序&#xff1a; 定义一个 i 变量指向这一组的第二个数据&#xff0c;定义一个 j 变量指向 i - gap 的位置。 将 i 下标的值放到…

使用python不改变格式的情况下批量替换word里面的内容

需要使用如$name,${id}这样的模板 import os import io from python_docx_replace import docx_replace,docx_get_keys from docx import Document from random import randrange student_list1,张三,2202330301 2,李四,2202330302 3,王五,2202330303 review["思路清晰、…

产品数据特性驱动设计

一、什么是数据特性 一个产品在宏观的视角下,是不同功能模块的有机组合;在微观的视角上,是千丝万缕的数据连接。 基于模块化设计思想,对产品进行业务化梳理,对业务进行模块化拆分出功能模块,功能模块就是产品的“逻辑”,而功能中的数据就是“特性”。 业务:比较固定…

防范TOCTOU竞态条件攻击

防范TOCTOU竞态条件攻击 在软件开发过程中&#xff0c;我们常常会遇到需要在使用资源之前检查其状态的情况。然而&#xff0c;如果资源的状态在检查和使用之间发生了变化&#xff0c;那么检查的结果可能会失效&#xff0c;导致软件在资源处于非正常状态时执行无效操作。这种时…

如何提升百度小程序的收录?百度小程序如何做优化?

​ 如何通过百度小程序获得更多的自然流量&#xff1f;这是做百度小程序肯定要考虑的问题&#xff0c;做百度小程序的目的就是想借助百度生态&#xff0c;做相应的关键词给自己的小程序引流&#xff0c;如何把流量给做起来呢&#xff0c;接下来我从不同的方面给大家进行分析讲解…

[牛客网]——C语言刷题day5

答案&#xff1a;D 解析&#xff1a;因为两个指针都指向的字符串常量&#xff0c;不能被重新赋值&#xff0c;*p*q是错误的 在C语言中&#xff0c;赋值语句的返回值都是所赋的值&#xff0c;所以才会有连续赋值的语句&#xff0c;例如ab10&#xff0c;因此&#xff0c;这里的i…

Github 2024-05-25 Rust开源项目日报Top10

根据Github Trendings的统计,今日(2024-05-25统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Rust项目10Svelte项目1TypeScript项目1Python项目1Go项目1Dart项目1RustDesk: 用Rust编写的开源远程桌面软件 创建周期:1218 天开发语言:Rust…

sw套合样条曲线

套合样条曲线,可以变成一条曲线,然后可以进行分段

springcloud 之 Ribbon Hystrix Feign bus 动态修改配置

Ribbon 是微服务架构图中负责负载均衡的 组件。 BeanLoadBalancedpublic RestTemplate getRestTemplate() {return new RestTemplate();}测试如下&#xff1a; //微服务方式 Ribbon方式GetMapping("ribbon/{name}")public String RibbonTest(PathVariable String nam…

SSRF服务端请求伪造漏洞原理与修复及靶场实践

SSRF服务端请求伪造漏洞原理与修复及靶场实践 SSRF漏洞原理与检测 SSRF&#xff08;Server-Side Request Forgery&#xff0c;服务器端请求伪造&#xff09;漏洞是一种因为服务端提供了远程访问服务&#xff0c;而并未对请求目标进行限制或限制不严格而引起的安全漏洞&#x…

极空间部署本地最强私有化PDF工具箱『Stirling-PDF』

极空间部署本地最强私有化PDF工具箱『Stirling-PDF』 哈喽小伙伴们好&#xff0c;我是Stark-C~ 关注我的粉丝应该知道&#xff0c;我在前几天教大家怎么在NAS上部署本地最强私有化PDF工具箱『Stirling-PDF』&#xff1a; &#x1f53a;评论区好几位小伙伴都提到了极空间的部署…

【免费Web系列】大家好 ,今天是Web课程的第六天点赞收藏关注,持续更新作品 !

这是Web第一天的课程大家可以传送过去学习 http://t.csdnimg.cn/K547r 后端Web实战(IOCDI) 前言 Web开发的基础知识 &#xff0c;包括 Tomcat、Servlet、HTTP协议等&#xff0c;我们都已经学习完毕了&#xff0c;那接下来&#xff0c;我们就要进入Web开发的实战篇。在实战篇中…

基于自抗扰控制器和线性误差反馈控制律(ADRC-LSEF)的控制系统simulink建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 4.1 ADRC原理 4.2 线性误差反馈控制律(LSEF) 4.3 ADRC-LSEF融合系统 5.完整工程文件 1.课题概述 基于自抗扰控制器和线性误差反馈控制律(ADRC-LSEF)的控制系统simulink建模与仿真。 2.系统仿真结果 …

[Unity报错] The type or namespace name ‘Newtonsoft‘ could not be found

简介 Unity在跑别人的代码时&#xff0c;控制台报了以下错误 The type or namespace name Newtonsoft could not be found 鉴于这块资料较少&#xff0c;写一下教程帮助后来者。 报错的原因主要是因为缺少Newtonsoft.json这个包&#xff0c;导致Unity在using该库时出现错误。…