数组常见操作--折半查找(***)
| 一、基本的查找:遍历找等于关键值的角标 |
|
【】输入:数组,查找关键字 【】输出:能找到输出角标,找不到输出-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。 |
|
|












浙公网安备 33010602011771号