[英]Binary chop search algorithm in C
我正在尝试用C语言编写二进制印章搜索功能,并且遇到了一些问题。 首先,在找到中点值之后,该函数甚至没有进入任何if循环。
函数是这样的:
int binarychopsearch(int i, int *array, int min, int N) {
min = 0;
int max = N - 1;
printf("Min = %d, Max = %d\n", min, max);
printf("i = %d\n", i);
int mid = (min + max)/2;
//printf("midpoint = %d\n", mid);
printf("array[%d] = %d\n", mid, array[mid]);
if (i < array[mid]) {
printf("in this loop\n");
printf("i = %d, array[mid] = %d\n", i, array[mid]);
// key is in lower subset
return binarychopsearch(i, array, min, mid - 1);
}
else if (i > array[mid]) {
printf("in the greater than loop\n");
printf("i = %d, array[mid] = %d\n", i, array[mid]);
return binarychopsearch(i, array, mid + 1, max);
}
else
//if (i = array[mid]) {
return mid;
}
我不包括输入值的主要来源,因为我认为问题出在此函数中。 它正在编译并运行,但是没有进入循环,因此找不到“ i”值的位置。 我很坚持这一点,因为我看不出问题出在哪里。
任何帮助都非常感谢!
谢谢
如果i
大于(或等于) array[mid]
那么您将无条件地从函数返回。 取而代之的是,您应该检查下一个条件,然后如果该条件也是假的,那么您就知道已经找到了要查找的值。
所以它看起来应该像
if (i < array[mid])
{
...
}
else if (i > array[mid])
{
...
}
else
return mid;
您的代码还有其他问题。
假设您有以下数组
int array[] = { 1, 2, 3, 4, 5 };
而您正在寻找值5
。
调用将如下所示:
| Call# | min | N | max | mid | array[mid] | | 1 | 0 | 5 | 4 | 2 | 3 | | 2 | 3 | 4 | 3 | 3 | 4 | | 3 | 4 | 3 | 2 | 2 | 3 | | 4 | 3 | 2 | 1 | 2 | 3 | | 5 | 3 | 1 | 0 | 1 | 2 | | 6 | 2 | 0 | -1 | 1 | 2 | . . .
很显然,这不会很好地结束。 实际上,您很快就会以负索引结尾,这使您处于不确定行为的领域 。
对于两种递归情况,建议您在尝试修复算法时在纸上创建自己的表。
如果您不使用max
而是使用N
来调用递归函数,即
return binarychopsearch(i, array, mid + 1, N);
那么您将有以下电话
| Call# | min | N | max | mid | array[mid] | | 1 | 0 | 5 | 4 | 2 | 3 | | 2 | 3 | 5 | 4 | 3 | 4 | | 3 | 4 | 5 | 4 | 4 | 5 |
因此,第三个调用找到了该数字,并返回了索引4
。
您还应该更改第一个电话:
return binarychopsearch(i, array, min, mid);
问题是当i >= array[mid]
:您系统地返回-1: esle if
使用esle if
if(i < array[mid])
{}
else if(i > array[mid])
{}
else // i == array[mid]
{}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.