二分法(折半法)查找数据

折半查找法也叫二分搜索,是一种在有序数组中查找某一特定元素的搜索算法

搜索过程:计算中点处的元素值,与目标值相比较,从而缩小搜索范围。如此往复。

 1 Half(int a[],int left,int right,int target)
 2 {
 3     int l,r,mid;
 4     l=left;
 5     r=right;
 6     mid=(l+r)/2;
 7     
 8     while(l<=r)
 9     {
10         if(a[mid]==target) return mid;
11         else
12         {
13             if(a[mid]>target) r=mid-1;
14             else l=mid+1;
15         }
16     }
17     return EOF;
18 }

 

可以明显的看到r=mid+1l=mid+1?很不对劲,不应该是r=midl=mid吗?

这样做可以解决两种情况

1. 当目标值为右端值的时候,搜索范围会逐渐向右端值靠近,直到mid=r-1时,此时程序进入了死循环,因为(l+r)/2的值将一直都是r-1。

为了解决这种情况可以令l=mid+1,这样就解决了mid取不到右端值的问题。同理左端值也一样。

2. 当目标值不在所给元素群时,比如在5 6 8 9中查找7,搜索范围会逐渐变成6 8,此时取中值,中值为6,小于目标值,mid还是6的位置。程序就陷入了死循环。

为了解决这种情况,可以令l=mid+1,这样就会逐渐出现左右交叉的情况,就能正确的跳出循环。

 

转载于:https://www.cnblogs.com/jawide/p/10593845.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值