数组常见操作--折半查找(***)

一、基本的查找:遍历找等于关键值的角标

【】输入:数组,查找关键字

【】输出:能找到输出角标,找不到输出-1,不存在输出-1

 

【】如果查找不到,就无返回值,会报错

【】所以,一般如果for循环找不到对应角标,就返回一个对立的值即可

【】会找到按照顺序来的第一个,基本是普查,还可以进一步优化;

【】尽管可以解决问题,但是低效;

【】找的是元素第一次出现的位置

 
 
二、折半查找
【】被查找的数组必须是有序的,顺序倒序都可以

【】mid角标对应的数值去寻找查找值,

【】首先设置三个变量记录min、max、mid三个角标,初始min=0,max=length-1,mid=(min+max)/2;

【】多次比较,if语句不行,用其加强版while,循环下去条件为真就是一直没查找到,arr【mid】!=key;

【】查不到,就面临arr【mid】>key,则变动一个角标max=mid-1(arr【mid】<key,则变动一个角标min=mid+1);然后再组成新的mid去测试;

【】如果min>max,说明查不到key,则返回一个不存在的值-1

【】最后如果不等不成立,就返回那个可以相等的角标mid

【】另一种循环条件不同的写法:max>=min,就可以继续循环下去,一旦出现max<min,即出现矛盾无法进行下去了

for循环适合直线连续的循环

while更适合非直线的循环,不达成条件或者说只要满足条件就一直循环下去

 
三、面试题

数组中涉及有序和查找,应该先想到折半查找;

如果元素存在,返回元素所在角标,正好顶替这个元素,原来元素右移一位也符合逻辑。

如果元素不存在,会出现max<min情况,(假定角标和元素相等,无论min=max=mid=10之后,因为目标值10.5大于mid而出现的min右移到11,则该值应该插入min角标11位置,或者目标值9.5小于mid而出现的max左移,则目标值应该插入min10所在位置。

所以这个值应该顶替角标位是min的角标位。

 

 【】返回值不再是-1而是min

 【】真实开发不会现做工具,而是直接使用已经写好的工具

 如果存在返回具体角标位置,如果不存在返回-角标-1,修改代码为

 【】-min告诉我们所查找的目标值不存在于数组所以用负数表示,

而-min-1则因为目标值如果是极小值,就会返回零,则分不清到底原来数值是否存在,所以减去-1。

 

 

 
 
 
posted @ 2025-07-09 21:52  ibddindonon  阅读(12)  评论(0)    收藏  举报