要求:在一个有序的数组中,找每个数据是否在该集合中,如果在,打印该数据在集合中的下标,否则打印找不到(必须是有序的!!!!!!!)
注意:二分查找虽然看起来很简单,但细节是关键,要么漏掉一个等号,要么少加个1;可以这样理解:思路很简单,细节是魔鬼!
具体的查找方式:
1.找到数组的中间位置
2.检测中间位置的数据是否与要查找的数据target相等
a:相等,找到,跳出循环
b:target < arr[mid],则target可能在arr[mid]的左半侧,继续到左半侧进行二分查找
c:target > arr[mid],则target可能在arr[mid]的右半侧,继续到右半侧进行二分查找
如果找到返回下标,否则继续,直到区间中没有元素时,说明target不在集合中。
易错点:
1.右半侧区间取值,该值决定了后序的写法
2.while循环的条件是否有等号
3.求中间位置的方法,直接相加除2容易造成溢出(因为c语言中整数有存储范围,所以这种方法处理比较大的值的时候,会导致数值溢出)
其余求中间位置的方法:a: mid = start + (end – start) / 2; b: mid = start + ((end – start) >> 1);
c:mid = (start & end) + ((start ^ end)>>1)也可以这样写: mid = (start & end) | ((start ^ end) >> 1);(最完美的,不会产生任何进位,所以不会溢出!)
4.更改start和end的边界时,不确定是否+1和-1
方法一:采用[satrt,end]区间(建议使用此方法!!!!!!!!!!!!1)
方法二:采用[start,end)区间
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/110989.html