C语言中的二进制切分搜索算法

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)/

我正试图用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;
}
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:ifuse
esle

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]
{}