二分相关问题

最终解决的问题:在一些有序整数中(可能有正,0,负),找到绝对值最小的数
1.普通的二分查找
int bin(int a,int n,int b)
{
int low=1,high=n;
while(low<high)
{
int mid=(low+high)/2;
if(a[mid]==b)
return mid
if(a[mid]>b)
high=mid-1;
else
low=mid+1;
}
return -1;
}
2.给定一些数据,找到小于某个值如b 范围中的最大值
分析:找到比b小的范围中的最大值,当a[mid]>b 时候已经表示a[mid-1]也大于b,所以high=mid-1合法,然而当a[mid]<b时候,无法确定a[mid+1]是否是小于b还是大于b,所以将low=mid 仍让将这个mid值放在下一次的二分查找中,因为只有满足此时的条件小于b的值的范围还在这里就属于合法,否则不合法。因为此题设置当找不到这样一个满足的值返回0的话会造成错误,所以用return -1 代表没找到,当接收到-1是代表没有小于b的值在这个数组中,也就是说数组中第一个元素就是最小值
(low+high+1)/2是为了避免进入死循环的如low=1,high=2,普通的二分写法会进入死循环。

int bin(int a,int n,int b)
{
int low=1,high=n;
while(low<high)
{
int mid=(low+high+1)/2;
if(a[mid]==b)
return mid
if(a[mid]>b)
high=mid-1;
else
low=mid;
}
if(a[low]<=b)
return low;
else
return -1;
}

void main()
{
int h=bin(a,n,0);
if(h==-1)
return a[1];
mmin=-a[h];
if(mmin<a[h+1])
return a[h+1];
else
return mmin;
}

猜你喜欢

转载自blog.csdn.net/weixin_44789333/article/details/89505067