【解析】
二分查找的话相信大家都有一定的了解过,其实就是不断的缩小范围,不断的缩小范围话不多说上代码。
int erfen(int k[],int n,int k)
{
int left=0,right=n-1,mid;
while(left<=right)
{
mid=(left+right)/2;
if(k[mid]==k)
return mid;
if(k>k[mid])
left=mid+1;
if(k<k[mid])
right=mid-1;
}
return -1;
}
那么接下来二分求下界和上界就是我要重点说的了,求下界的话其实就是求下界的函数,当一个元素存在时返回它出现的第一个位置。如果不存在,返回一个下标k:在此处插入元素,原来的元素都往后挪。
int erfenxia(int k[],int n,int p)
{
int left=0;right=n;
while(left<right)
{
mid=left+(right-left)/2;
if(k[mid]>=p)
right=mid;//如果相等的话,前面可能还会有所以往前,大于也要往前
else
left=mid+1;//小于说明要往后
}
return left;
}
求上界的话其实就是,当元素存在时返回它出现的最后一个位置的后面一个位置。不存在,则返回一个下标k:在此处插入k,原来的元素全部向后移动一个位置,后序列依然有序
int erfen(int k[],int n,int p)
{
int left=0;right=n;
while(left<right)
{
mid=left+(right-left)/2;
if(k[mid]<=p)
left=mid+1;
else
right=mid;
}
return left;
}
下界的规律。上界也差不多
kmid]等于p,至少已经找到一个,但前面可能还有,所以区间为[left,mid],继续往前面进行查找。
k[mid]大于p,所求的位置不可能在后面,但可能为mid,区间为[left,mid]
k[mid]小于p,所求的位置不可能在前面,也不会为mid,区间为[mid+1,right]