繁体   English   中英

C中的二进制搜索-整数不在数组中时错误的退出代码

[英]Binary Search in C - wrong exit code when integer not in the array

这个C Binary搜索函数正在寻找它应该执行的操作,但是我得到了错误:“ \\期望退出代码为1,而不是0”,如果它要查找的整数不在数组中。 我试图在最后删除false或删除else语句,但这不起作用。 谁能看到原因?

bool search(int value, int values[], int n)
{
    int min = 0;
    int max = n-1;
    int mid = (max + min) / 2;

    if(n <= 0)
        {
            return false;
        }

    while (values[max] >= values[min]) 
        {
            if (values[mid] == value)
                {
                    return true; 
                }

            else if (values[mid] > value) //value's on the left of mid
                {
                    min = 0; 
                    max = mid - 1;
                    return true;
                }

            else if (values[mid] < value) //value's on the right of mid  
                {
                    max = n-1;
                    min = mid + 1;
                    return true;
                }

            else
                {
                    return false;
                }

        }
    return false;
}

我只是将代码修改为以下代码,并获得了完全相同的结果。 以为这样可以缩小问题的范围。

bool search(int value, int values[], int n)
{
int min = 0;
int max = n-1;
int mid = (max + min) / 2;

if(n <= 0)
{
    return false;
}

if (values[max] >= values[min]) 
{
    if (values[mid] == value)
    {
        return true; 
    }

    else if (values[mid] > value) //value's on the left of mid
    {
        min = 0; 
        max = mid - 1;
        return true;
    }

    else if (values[mid] < value) //value's on the right of mid  
    {
        max = n-1;
        min = mid + 1;
        return true;
    }

    else
    {
        return false;
    }

}    
else
{
    return 1;
}   
}

注意,正确和错误的返回码取决于上下文。

在C中-False被认为只是数字0,True是不为0的任何东西。

在Linux中-谈论进程的返回码(或退出码)是相反的。 True仅是0(表示正常退出),而False则不是0(表示退出带有某些错误,取决于代码)。

另外 :您还有一个逻辑错误- search功能代码无法正常工作。 当您检查值是在mid值的左侧还是右侧时:

  1. 您不应该返回任何内容,而while循环应该继续。 在您的实现中,while循环在一次迭代后退出-始终如此。 不管输入。
  2. 您错误地更新了min (在左侧检查中)和max (在右侧检查中)。 您总是将它们更新为第一个/最后一个索引,这是错误的。 每次迭代,您要搜索的范围应该比上一个范围缩小一半。

在您的帮助下,我终于有了赢家。 看来我需要从“ while”语句中删除数组名称(values []); 而且我还必须在每个'if / if else'语句中引用“ int mid =(min + max)/ 2”。 感谢大家。 唷!

bool search(int value, int values[], int n) //values = the array
{
    int min = 0;
    int max = n - 1;

    while (min <= max) 
    {
        int mid = (min + max) / 2;    

        if (values[mid] == value)
        {
            return true; 
        }

        else if (value < values[mid]) //value's on the left of mid
        {
            max = mid - 1;
        }

        else if (value > values[mid]) //value's on the right of mid  
        {
           min = mid + 1;
        }
    }
    return false;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM