您的位置:首页 > 其它

二分法(查找、求上界、求下界)

2016-12-27 07:36 260 查看
【解析】

二分查找的话相信大家都有一定的了解过,其实就是不断的缩小范围,不断的缩小范围话不多说上代码。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] 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: