C中的二进制斩波搜索算法

时间:2014-03-04 13:45:28

标签: 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)/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”值的位置。因为我看不出它出了什么问题,所以我很困惑。

非常感谢任何帮助!

由于

2 个答案:

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