当前位置: 首页 > news >正文

C语言——二分法搜索数组中特定元素并返回下标

以下两种方法只提供了核心代码(伪代码):

二分法最重要的就是边界问题,处理好区间的边界。注意区分

一、左闭右闭法

int left=0;

int right=numsize-1;

while(left<=night)//注意这里是可以相等的,因为左闭右闭,左右边界是可以相等的。举个例子:[1,1]是存在的。

{

        int middle=(left+right)/2;

        if(nums[middle]>target){right=middle-1;}//这里要减1是因为要更新左区间的右边界,在接下来的搜索中需要去掉这个middle处的元素,因为这是右闭区间,middle处的这个元素已经比target目标值大了,在下次的更新中我们不能把middle这个边界放进来了,要去掉。

        elseif(nums(middle)<target){left=middle+1;}//这里的道理和上面是一样的,更新右区间的左边界。

        else

            return middle;

}

二、左闭右开法

int left=0;

int right=numsize;

while(left<right)

{

        int middle=(left+right)/2;

        if(nums[middle]>target){right=middle;}//注意这里是middle不是加一了,因为右区间是开区间,区间内已经不包含middle索引对应的元素了,所以,不用进行加一更新。

        else if(nums[middle]<target){left=middle+1;}//这里又加一了,区间的左边界是闭的,包含左边界,所以,这里需要加一进行更新。

        else

        return middle;

}

总结一下

区间都是闭得话,while判断得时候,left、right需要加等号。还有就是,左右边界在搜索时需要加1来进行更新,哪一个边界是闭,哪边边界就加1,开区间就不用加一。

切记,这两种方法不能混用在一起。


http://www.mrgr.cn/news/26548.html

相关文章:

  • 听劝!40天涨粉10W+,这个AI赛道太好赚了!
  • ADS1248 测电阻 0~10欧姆
  • 个体诊所社区门诊医务室电子处方生成开单软件 佳易王诊所处方管理系统操作教程
  • [XILINX] 正点原子ZYNQ7015开发板!ZYNQ 7000系列、双核ARM、PCIe2.0、SFPX2,性能强悍,资料丰富!
  • iso speed
  • 癌症细胞状态的十年探索:单细胞RNA测序的启示
  • 使用 Elastic 和 LM Studio 的 Herding Llama 3.1
  • Python OpenCV精讲系列 - 高级图像处理技术(六)
  • PHP一键寄送尽在掌中快递寄件小程序
  • Prompt最佳实践|善用分隔符,让你的Prompt更清晰
  • 深兰科技董事长陈海波应出席“香港大学国际科创大赛”
  • 使用开源框架HandyControl
  • C++学习笔记(23)
  • SoapShell 更新 | 新增调用cmd执行系统命令
  • JavaScript和jQuery的区别
  • 基于Netty实现TCP客户端:封装断线重连、连接保持
  • 安全建设当中的冷门知识
  • 开源链动 2+1 模式、AI 智能名片与 S2B2C 商城小程序:重塑私域微商新生态
  • 一文读懂C语言动静态库
  • 软件测试工程师面试整理-编程与自动化