在一篇博文中,我看到有个标题叫 90%的专业程序员写不出无bug的二分查找程序,,主要分析出了在3个数据中,有20来种情况得考虑,但绝大部分人都没考虑。如果超过一定的输入域,就会产生很多问题,那时就不得不考虑所有情况。
在网上搜索一番后,又看到另一本书中提到了引进大众的二分查找,出现的问题如下:
//数组必须为有序的序列
#include <stdio.h>
int BinarySearch(int a[],int n,int item);
int main (int argc, const char * argv[])
{
int a[] = {1,2,3,4,5};
int val = 0;
val = BinarySearch(a, 5, 10);
printf("%d\n", val);
return 0;
}
int BinarySearch(int *a,int n,int item)
{
int mid, left = 0,
right = n - 1;
while ( left <= right ) {
mid = (left + right )/2 ; //问题出在这里,left+right超出int范围(整型溢出)时,就会由正数变为负数,自然mid也就不对了,
if ( item < a[mid] ) //改进方法:mid = right + ( left - right )/2
right = mid -1;
else if ( item > a[mid] )
left = mid + 1;
else
return mid;
}
return -1;
}
为了方便学习,另外附上递归算法.
#include <stdio.h>
#define N 5
int BinarySearch(int item,int* a,int left,int right);
int BinarySearch(int item,int* a,int left,int right)
{
int mid = (left + right)/2;
if( left <= right ){
if ( item < a[mid]) return BinarySearch(item, a, left, mid-1);
else if( item > a[mid] ) return BinarySearch(item, a, mid+1, right);
else return mid;
}
else return -1;
}
int main (int argc, const char * argv[])
{
int a[N]={1,2,3,4,5},item;
int left = 0, right = N - 1;
scanf("%d",&item);
printf("%d",BinarySearch(item, a, left, right));
return 0;
}