二分查找(C语言版)

导读:本篇文章讲解 二分查找(C语言版),希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

要求:在一个有序的数组中,找每个数据是否在该集合中,如果在,打印该数据在集合中的下标,否则打印找不到(必须是有序的!!!!!!!

注意:二分查找虽然看起来很简单,但细节是关键,要么漏掉一个等号,要么少加个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

二分查找(C语言版)

方法二:采用[start,end)区间 

二分查找(C语言版)

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/110989.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!