【发布时间】:2021-11-14 21:59:29
【问题描述】:
所以我根据维基百科伪代码用 C 语言编写了一个二进制搜索程序,但即使在处理只有一个元素的数组时它也会一直返回 false。我不知道哪里出了问题。任何帮助表示赞赏!顺便说一句,这是一个编码挑战,所以我没有自己编写测试套件。
编辑:功能正在测试如下:
int arr[] = {6};
size_t length = sizeof(arr)/sizeof(*arr);
TEST_ASSER((&arr[0] == binary_search(6, arr, length));
int *binary_search(int value, const int *arr, size_t length) {
int L = 0;
int R = length - 1;
static int m;
while(L <= R) {
m = floor((L + R) / 2);
if(arr[m] < value) {
L = m + 1;
} else if(arr[m] > value) {
R = m - 1;
} else { return (&m); }
}
return 0;
}
编辑:因此,在我从原始函数中删除了 const 项后,它与以下代码一起使用。感谢大家的帮助!
int *binary_search(int value, int *arr, size_t length) {
int L = 0;
int R = length - 1;
static int m;
while(L <= R) {
m = (L + R) / 2; // no floor needed
if(arr[m] < value) {
L = m + 1;
} else if(arr[m] > value) {
R = m - 1;
} else {
return &arr[m];
}
}
return 0; // not found
}
【问题讨论】:
-
return (&m)真的没有意义。为什么要返回指向索引的指针,而不是索引本身?此外,floor((L + R) / 2)也没有多大意义,因为所有涉及的值都是整数值,结果将是截断的整数值。 -
至于您的问题,您尝试搜索的数据是什么?你如何调用你的函数?你如何检查它的结果?请尝试创建一个minimal reproducible example 向我们展示,最好使用您传递给函数的硬编码数组。
-
欢迎来到 SO。请提供MCVE,说明您如何调用函数以及输入的数据。
-
我认为您应该将此作为学习如何调试代码的最佳时机。更具体地说,如何使用 debugger 在监控变量及其值的同时逐条执行代码。
-
回到我的第一条评论,想想你实际上从函数中返回了什么。然后想想你期望它返回什么,因为这不是函数返回的。
标签: arrays c algorithm binary-search function-definition