我正在尝试用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”值的位置。因为我看不出它出了什么问题,所以我很困惑。
非常感谢任何帮助!
由于
答案 0 :(得分:1)
如果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);
答案 1 :(得分:0)
问题出在i >= array[mid]
时:系统地返回-1:使用esle if
if(i < array[mid])
{}
else if(i > array[mid])
{}
else // i == array[mid]
{}