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

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

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

 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,这样就会逐渐出现左右交叉的情况,就能正确的跳出循环。

 

posted @ 2019-03-25 15:07  jawide  阅读(1036)  评论(0编辑  收藏  举报