二进制搜索未返回正确的值
Binary search not returning correct value
我正在C++中实现二进制搜索算法,但该算法没有返回正确的值。代码可以在这里找到。
template<class T>
int binary_search(T search_value, T search_array[]) {
int mid; /* The middle element of the remaining array to be searched. */
int min = 0; /* The first index of the array. */
/* This forumla gives us the size of the array. */
int max = sizeof(search_array)/sizeof(search_array[0]);
/* Continue searching until min >= max. */
while (min < max) {
/* Compute the value of mid using a formula that won't produce a number
* larger than the maximum allowed value of an integer. */
mid = (max-min)/2 + min;
/* Depending the whether search_value is larger or smaller than the
* value of whatever is at search_array[mid], set one of mid and max
* equal to mid. */
if (search_value > search_array[mid])
min = mid + 1;
else if (search_value < search_array[mid])
max = mid + 1;
else {
return mid;
}
}
return -1;
}
给定一个数组{0,1,3,5,7,9}并搜索3,函数应返回2,即数组中3的索引。不过,我的函数返回-1,这意味着在数组中找不到3。问题出在哪里?
int max = sizeof(search_array)/sizeof(search_array[0]);
这种方法不适合计算数组的大小,它只适用于创建数组的函数。
将数组的大小作为函数的参数传递,这是最简单的方法。
这一行至少有一个问题:
int max = sizeof(search_array)/sizeof(search_array[0]);
数组没有通过函数传递,所以您的声明:
int binary_search(T search_value, T search_array[])
与相同
int binary_search(T search_value, T *search_array)
因此,max
是指针的大小除以元素的大小,所以在最佳情况下,它可能高达6,但最有可能是0或1。
我认为在C++中,您可以通过引用传递数组,并使用以下声明形式知道其大小:
template <size_t array_length>
void foo (const char (&data) [array_length])
{
// ...
}
您的实现中有一个错误:
else if (search_value < search_array[mid])
max = mid + 1;
应该是:
max = mid - 1;
这一行并没有做你认为它会做的事情:
int max = sizeof(search_array)/sizeof(search_array[0]);
因为数组在传递到函数中时会自动衰减为指针,这将有效地等于:
int max = sizeof(void*)/sizeof(search_array[0]);
这不是你想要的。使用为您存储大小的std::vector
或手动size_t array_length
参数。
int max = sizeof(search_array)/sizeof(search_array[0]);
search_array
是指针而不是数组。
函数原型中T
类型数组的参数被自动调整为指向T
的指针。
此行涉及:
int max = sizeof(search_array)/sizeof(search_array[0]);
sizeof(search_array)
将是指针的大小,4或8个字节,具体取决于平台。通常,我会尽量避免在变量上使用sizeof
。它在打字时表现得更好。例如,在您的案例中为sizeof(T)
。
当索引从0开始时,您的最大值需要少一个。
相关文章:
- 如何从 std::vector 搜索和返回项目
- C++二叉搜索树模板从函数返回节点
- 返回不需要的值的二叉搜索程序
- Glob 搜索目录也会返回文件
- 在对象数组中搜索字符串并返回相应值的函数
- 查找存储在二叉搜索树的所有非叶子中的数据总和?(返回整数的独立递归函数
- 对于具有引用返回类型的搜索算法,默认返回值应该是什么?
- 返回二叉搜索树特定级别的节点数的函数
- 快速搜索链表未编译,需要返回语句
- 按扩展名过滤搜索文件会返回太多结果
- 如何使用二叉搜索返回姓氏(给定字符串)的第一个索引/出现次数?
- 二叉搜索功能始终返回 -1 值而不是索引
- C/C++ 从根位置搜索文件夹并返回绝对路径
- 搜索文本文件并返回等号后的值
- 返回 std::p air<const CustomClass &, bool> 用于搜索函数中的失败情况,当 CustomClass 是抽象基类时
- 这个树搜索功能让我发疯.它返回 NULL,但不知何故主函数中的值发生了变化
- 按属性搜索对象的向量并返回迭代器
- 在{8,4,6,2}中搜索4时,std::binary_search是否有任何实现将返回true
- 数组中的线性搜索返回意外结果
- 时间在二叉搜索树中返回 0