【发布时间】:2016-11-10 12:55:39
【问题描述】:
我正在编写二进制搜索算法的代码。
代码:
#include "cs50.h"
int main(void) {
int n = GetInt();
int value = GetInt();
int values[n];
for (int i = 0; i < n; i++) {
printf("Put in number %i ", i + 1);
values[i] = GetInt();
}
int mid = (n - 1) / 2;
int en = 0;
int ex = n - 1;
for (int i = 0, xt = i + 1; i < xt; i++) {
if (value > values[mid]) {
en = mid;
mid = (en + ex) / 2;
}
else if (value < values[mid]) {
ex = mid;
mid = (en + ex) / 2;
}
else if (value == values[mid]) {
printf("found");
break;
} else {
printf("not found");
break;
}
}
}
但它只在要查找的值位于中间某个位置时才有效。
在以下情况下失败:
- 要找到的值是第一个或最后一个。
- 要查找的值不在输入的值中。
我真的想不通。
【问题讨论】:
-
这是一个理想的情况,使用调试器将极大地帮助您。或者甚至一些调试打印语句怎么样?这些只是您在寻求帮助之前应该执行的标准调试 101 步骤。
-
这是一个很好的调试起点:ericlippert.com/2014/03/05/how-to-debug-small-programs。在这种情况下,我建议删除
GetInt并以您知道出错的最小情况开始values,然后弄清楚会发生什么。 -
int i = 0,xt = i+1; i<xt;你确定这是你想要的吗?这意味着循环只运行一次。即使是非常基本的调试,您也可以轻松找到这一点。 -
这可能从不注释代码开始(您使用 看起来 的“计数循环”,二进制搜索对此没有用处),选择惰性变量名称 (@987654326 @ 对于“计数器变量”来说是完全可以的,
mid和n很容易,但是en和ex是在自找麻烦(lo&hi会很懒惰,但是使用 IDE无处不在,使用low&high)) 似乎每个人都过得更好,并将有趣的分支放入 if-else if-else 链:>、和 else? (everything seems alright- 根据?) -
你认为在什么情况下会打印'not found'消息?
else子句对我来说似乎是多余的。平等的检验也是多余的;如果该值既不大于也不小于该值,则它必须等于它。
标签: c algorithm binary-search cs50