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

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

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

一、左闭右闭法

int left=0;

int right=numsize-1;

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

{

int middle=(left+right)/2;

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

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

else

return middle;

}

总结一下

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

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

相关推荐
小此方2 小时前
「C++AI大模型接入SDK」(一) API接入与本地两种方式对比、API Key获取、API报文详解与简单API的构建
开发语言·c++·人工智能
wuyk5552 小时前
Python实战项目02:学生成绩管理系统(控制台|CSV导出|完整落地)
开发语言·python
浪子明X9 小时前
十六位账本怎样发现传输差错:Internet Checksum 生活类比
开发语言
v_34836087629 小时前
Android native端 堆栈打印
android·算法
residual_fan9 小时前
【学术论文】航空发动机故障诊断智能体:基于持续对比强化学习的动态优化方法
人工智能·算法·数据挖掘·数据分析
老当益壮梁奶奶10 小时前
51单片机DS18B20温度传感器详解:单总线时序与C51驱动实现
笔记·stm32·单片机·嵌入式硬件·51单片机
GreenTea10 小时前
OpenAI Agents API 上手实测:一次调用把整个 agent loop 甩给 OpenAI
前端·后端·算法
小叶肥辉10 小时前
LangChain链和LangGraph图的学习笔记【三】——分别用langchain_openai库和langchain_community库调用大模型
笔记·python·langchain
深圳满意度咨询11 小时前
医院满意度数字化测评系统:从数据采集到智能决策的技术实践
算法
xiangyun6112 小时前
【408数据结构 08】队列:循环队列判空判满,408年年考,一次讲清
c语言·开发语言·数据结构·c++·算法