//递增数列下界
int f1(int * array,int l, int r, int key)
{
if (l == r) return l;
int m = (l + r)/2;
if (key<=array[m])
{
return f1(array, l, m,key);
}
else
{
return f1(array,m+1,r,key);
}
}
//递增数列上界
int f2(int * array,int l, int r, int key)
{
if (l == r) return l;
int m = (l+ r +1)/2;
if (key < array[m])
{
return f2(array, l, m-1, key);
}
else
{
return f2(array,m,r,key);
}
}
//递减数列上界
int f3(int * array,int l, int r, int key)
{
int mid = (l+r+1)/2;
if(l==r)
{
return l;
}
if(key<array[mid])
{
return f3(array,mid,r,key);
}
else
{
return f3(array,l,mid-1,key);
}
}
//递减数列下界
int f4(int * array,int l, int r, int key)
{
int mid = (l+r+1)/2;
if(l==r)
{
return l;
}
if(key<=array[mid])
{
return f4(array,mid,r,key);
}
else
{
return f4(array,l,mid-1,key);
}
}
注:只针对于Key值存在于这个数列中,对于不存在的情况,进行相应的变形即可。
以上采用了递归思路,我们再来同步更新非递归版本的:
//求单调递增序列下界
int find(int x,int n,int num[])
{
int low=0;
int high=n;
int mid;
int res = -1;
while(low <= high)
{
mid = (low + high)/2;
if(num[mid] == x)
{
res = mid;
high = mid - 1;
}
else if(num[mid]<x)
{
low = mid+1;
}
else
{
high=mid-1;
}
}
return res;
}