繁体   English   中英

在C中实现二进制搜索

[英]Implementing Binary Search in C

关于实现二进制搜索的快速问题:-)。 这是我现在拥有的功能,我还没有弄清楚为i传递正确数字的逻辑。 但是,当我调试此函数时,我发现当value = values [i](匹配)时,会发生意外的行为。

我的意图是返回true,从而触发匹配并退出该函数。 实际行为导致返回true; 然后返回false; (不正确)。 有谁知道如何确保返回true? 退出功能? 或指导我解决错误的提示? 非常感谢!

bool search(int value, int values[], int n){

   int i = ((n - 1) / 2); 

   if(value == values[i])
   {
      return true;
   }
   else if(value < values[i])
   {
      n = i;
      search(value, values, n);
   }
   else if(value > values[i])
   {
      n = (i * 1.5);
      search(value, values, n);
   } 
   return false; 
}

您缺少几个return关键字。

search(value, values, n);

应该:

return search(value, values, n);

有两条这样的线。

没有这些return关键字,该函数将始终结束并返回false

更新,以回应OP的评论

您的函数没有进行任何检查,以确保不会超出范围地访问values 我认为它将永远不会尝试访问具有负索引的任何内容,但是它有机会访问索引高于允许的索引值的元素。 我建议更改功能以使用:

int search(int value, int values[], int start, int end)
{
   if ( start >= end )
   {
      return 0;
   }

   int mid = (start + end)/2; 

   if(value < values[mid])
   {
      return search(value, values, start, mid);
   }
   else if(value > values[mid])
   {
      return search(value, values, mid+1, end);
   } 
   else
   {
      return (value == values[mid]);
   }
}

与右调用它startend从函数外部调用时的值。

int values[] = {1, 4, 6, 8};
bool found = search(2, values, 0, sizeof(values));

让我评论一下,有可能使用确切的接口编写有效的函数版本。 就像是:

bool search(int value, int values[], int n)
{
  if (n == 0) // searching in an empty set?
    return false;

  int i = (n - 1) / 2;

  if (value == values[i]) // the middle contains value?
    return true;
  else if (value < values[i]) // would be value to the left of i
    return search(value, values, i);
   else // so it would be to the right; no need of if (value > values[i])
     return search(value, values + i + 1, n - i - 1);
}

该函数具有与您相同的签名,它通过元素n的数量和数组指针的基数来减小搜索范围。 在中心的左侧执行搜索时,元素数减少到i而在数组基地址的右侧进行搜索时,如果元素搜索数增加i + 1且元素数量减少i + 1

请注意, if没有必要,则使用第三位。 如果达到,则谓词将始终为true,因为value不等于也不小于value[i] ,因此它更大。

暂无
暂无

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

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