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,开区间就不用加一。

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

相关推荐
肩上风骋6 分钟前
C++14特性
开发语言·c++·c++14特性
sheeta199815 分钟前
LeetCode 每日一题笔记 日期:2026.05.29 题目:3300. 最小元素
笔记·leetcode
_日拱一卒17 分钟前
LeetCode:994腐烂的橘子
java·数据结构·算法·leetcode·深度优先
芯片智造20 分钟前
cmp后清洗的刷子是什么材质?
经验分享
中屹指纹浏览器39 分钟前
2026指纹浏览器代理链路适配原理与多线路集群调度方案
经验分享·笔记
珂朵莉MM1 小时前
第七届全球校园人工智能算法精英大赛-算法巅峰赛产业命题赛第3赛季优化题--束搜索
人工智能·算法
不羁的木木1 小时前
ArkWeb实战学习笔记05-综合实战:构建混合应用
笔记·学习·harmonyos
CC大煊1 小时前
一个Javaer的AI转型笔记(1):入坑LangChain,我的第一个hello world
笔记·langchain
Omics Pro2 小时前
首个!外源天然产物综合性代谢图谱
数据库·人工智能·算法·机器学习·r语言
JAVA社区2 小时前
Java高级全套教程(十)—— SpringCloudAlibaba超详细实战详解
java·开发语言·spring cloud·面试·职场和发展