C语言中的二进制切分搜索算法
我正试图用C语言编写一个二进制切块搜索函数,但遇到了一些问题。首先,在找到中点值之后,函数甚至没有进入任何if循环 其功能是:C语言中的二进制切分搜索算法,c,recursion,C,Recursion,我正试图用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)/
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;
}
int二进制搜索(int i,int*数组,int min,int N){
最小值=0;
int max=N-1;
printf(“最小=%d,最大=%d\n”,最小,最大);
printf(“i=%d\n”,i);
int mid=(最小+最大)/2;
//printf(“中点=%d\n”,中点);
printf(“数组[%d]=%d\n”,mid,数组[mid]);
if(iarray[mid]){
printf(“在大于循环中\n”);
printf(“i=%d,数组[mid]=%d\n”,i,数组[mid]);
返回binarycopsearch(i,数组,mid+1,max);
}
其他的
//if(i=数组[mid]){
中途返回;
}
我不包括输入值来自的main,因为我认为问题出在这个函数中。它正在编译和运行,但没有进入循环,因此找不到“I”值的位置。我对此非常困惑,因为我看不出它出了什么问题
非常感谢您的帮助
谢谢如果
i
大于(或等于)数组[mid],那么您将无条件地从函数返回。相反,您应该检查下一个条件,如果该条件为false,那么您知道您已经找到了要查找的值
所以它应该看起来像
if (i < array[mid])
{
...
}
else if (i > array[mid])
{
...
}
else
return mid;
您正在查找值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 |
.
.
.
然后您将有以下呼叫
| 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 |
问题是当
i>=array[mid]
时:系统地返回-1:ifuseesle
if(i < array[mid])
{}
else if(i > array[mid])
{}
else // i == array[mid]
{}
if(i数组[mid])
{}
else//i==数组[mid]
{}
我应该怎么做?对不起,我不明白你的意思?@user3306583用一些示例代码更新了我的答案OK,这似乎让我陷入了无限循环。我将更新原始问题中的代码,以便你可以看到我在那里做了什么…@user3306583一个问题是,你在第二次递归调用中通过了max
,当你你应该使用N
。从技术上讲,这不是一个“循环”,而是一个if“语句”;)请提交格式正确的代码。
| 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 |
return binarychopsearch(i, array, min, mid);
if(i < array[mid])
{}
else if(i > array[mid])
{}
else // i == array[mid]
{}