二分查找

zy____ 2018-02-02 09:35:20


向各位大佬求教:这两个二分查找函数,上面的(我写的)和下面的本质区别在哪里?
return 一个函数,是不是相当于递归和循环?
这两个函数在参数high为数字数组的长度时,输出没有差别。
但是当high小于数组长度时,如下图

第一个函数bisearch()输出为6,原因我知道;
第二个函数binarySearch()输出为5
正确的显然是5,但是为什么binarySearch输出正确而bisearch输出错误?
...全文
233 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
自信男孩 2018-02-03
  • 打赏
  • 举报
回复
int bisearch(int v[],int x,int low,int high)
{
    int mid=(low+high)/2;
    while(low < high&&x!=v[mid])
    {
        if(x>v[mid])
            low=mid+1;
        else
            high=mid-1;
        mid=(low+high)/2;
    }
    if(x==v[mid])
        return mid;
    else if(low >= high)
        return (x>v[low])?low+1:low;
}
试一下这个。 改一下while循环的条件,另外,再改一下最后一个else if判断条件。即将上面的low <= high等号放到下面去判断
zy____ 2018-02-03
  • 打赏
  • 举报
回复
int bisearch(int v[],int x,int low,int high)
{
	int mid=(low+high)/2;
	while(low<=high&&x!=v[mid])
	{
		if(x>v[mid])
			low=mid+1;
		else
			high=mid-1;
		mid=(low+high)/2;
	}
	if(x==v[mid])
		return mid;
	else if(low>high)
		return (x>v[low])?low+1:low;
}
int binarySearch(int a[], int item, int low, int high)
{
    if (high <= low)
        return (item > a[low])?  (low + 1): low;

    int mid = (low + high)/2;

    if(item == a[mid])
        return mid+1;

    if(item > a[mid])
        return binarySearch(a, item, mid+1, high);
    return binarySearch(a, item, low, mid-1);
}
zy____ 2018-02-03
  • 打赏
  • 举报
回复
下面的我写的,上面的是正确的,很抱歉图发错了
zy____ 2018-02-03
  • 打赏
  • 举报
回复
引用 8 楼 hdt 的回复:
int bisearch(int v[],int x,int low,int high)
{
	int mid;
	while( low<high-1)
	{
		mid= low+(high-low)/2;
		if(x>v[mid])
		{
		   low=mid;
		}
		else
		{
			high=mid;
		}
	}
	if( x==v[low])
		return low;
	else if( x==v[high])
		return high;
	else
		return -1;
}
非常感谢点拨,最后一个else确实应该加上
zy____ 2018-02-03
  • 打赏
  • 举报
回复
引用 4 楼 cfjtaishan 的回复:
int bisearch(int v[],int x,int low,int high)
{
    int mid=(low+high)/2;
    while(low < high&&x!=v[mid])
    {
        if(x>v[mid])
            low=mid+1;
        else
            high=mid-1;
        mid=(low+high)/2;
    }
    if(x==v[mid])
        return mid;
    else if(low >= high)
        return (x>v[low])?low+1:low;
}
试一下这个。 改一下while循环的条件,另外,再改一下最后一个else if判断条件。即将上面的low <= high等号放到下面去判断
非常感谢点拨!可以的,当while的测试条件如此改变后,就避免了溢出的情况
真相重于对错 2018-02-03
  • 打赏
  • 举报
回复
int bisearch(int v[],int x,int low,int high)
{
	int mid;
	while( low<high-1)
	{
		mid= low+(high-low)/2;
		if(x>v[mid])
		{
		   low=mid;
		}
		else
		{
			high=mid;
		}
	}
	if( x==v[low])
		return low;
	else if( x==v[high])
		return high;
	else
		return -1;
}
真相重于对错 2018-02-03
  • 打赏
  • 举报
回复
int bisearch(int v[],int x,int low,int high) { int mid=(low+high)/2; //这里如果low和high足够大,将溢出。 while(low<=high&&x!=v[mid]) { if(x>v[mid]) low=mid+1; else high=mid-1; mid=(low+high)/2; } if(x==v[mid]) return mid; else if(low>high) return (x>v[low])?low+1:low; // 缺少一个else 如果要找的数不在序列中将出错 ,还有因为缺少一个分支所以要求严格的编译器将无法通过编译 }
zy____ 2018-02-03
  • 打赏
  • 举报
回复
引用 5 楼 hdt 的回复:
我看到两处bug
求教
真相重于对错 2018-02-03
  • 打赏
  • 举报
回复
我看到两处bug
老马何以识途 2018-02-02
  • 打赏
  • 举报
回复
binarySearch和binsearch都怎么实现的?没看到啊

69,372

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧