先上 二分查找 的两个版本代码
版本一:递归
/*
说明:v为数组,low为数组的下界,high为数组最后一个元素的下一个位置,即区间[low, high),x为需要查找的元素
*/
int binsearch(int A[],int low, int high, int x)
{
int mid = (low+high) / 2;
if(x == A[mid])
return mid;
if(low >= high)
return -1;
if(x < A[mid])
return binsearch(A,low,mid,x);
else
return binsearch(A,mid,high,x);
}
版本二:用while循环
/*
说明:x为需要查找的元素,v为数组,n为数组的大小。
*/
int binsearch(int* A, int low, int high, int v)
{
int mid;
while(low < high)
{
mid = (low+high)/2;
if(x < v[mid])
high = mid;
else if(x > v[mid])
low = mid+1;
else
return mid;
}
return -1;
}
考虑一个有趣的问题:如果数组中有多个元素都是 v ,上面的函数返回哪一个下标呢?它返回的是中间那个。那么我们能不能求出 v 的完整区间呢。