折半查找法也叫二分搜索,是一种在有序数组中查找某一特定元素的搜索算法。
搜索过程:计算中点处的元素值,与目标值相比较,从而缩小搜索范围。如此往复。
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+1与l=mid+1?很不对劲,不应该是r=mid,l=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,这样就会逐渐出现左右交叉的情况,就能正确的跳出循环。