c - 在 C 中实现二进制搜索

标签 c binary-search

关于实现二进制搜索的快速问题 :-)。这是我现在拥有的功能,我还没有完全弄清楚为 i 传递正确数字的逻辑。然而,当我调试这个函数时,我发现当 value = values[i] (match) 时,发生了意想不到的行为。

我的意图是返回 true,从而触发匹配并退出函数。实际行为导致 return true; 然后返回false; (错误地)。有谁知道如何确保 return 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));

关于c - 在 C 中实现二进制搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33836472/

相关文章:

c - 在C中使用printf()和fork()复制输出

c - 为什么 readdir() 将 ".."列为文件之一?

c - 使用内联汇编通过 C 调用 golang 函数时, `mov' 的内存引用过多

c++ - 实现二进制搜索猜谜游戏

c++ - 为什么会出现段错误以及如何解决它

c++ - Lua_hook 和 lua_Debug->event

algorithm - 在一个数组中进行二进制搜索,除了两个元素之外,所有元素都被排序,即所有元素都被排序,然后交换两个相邻元素?

c# - 范围内数字的 BinarySearch 限制

java - 返回对象而不是索引的二进制搜索的实现?

c - 一个简单的pthread变量共享