来智慧 发表于 2020-8-22 09:08:00

自己写了个二分查找,但是函数里的打印信息和main里打印的值不一样,大家进来看一下!!

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int search(int data[], int first, int last, int number)
{
    int mid = (last + first) / 2;

    if(data == number){
      printf("%d %d %d %d\n", mid, data, first, last);
      return mid;
    }
    if(first >= last){
      return -1;
    }
    if(data > number){
      search(data, first, mid-1, number);
    }
    if(data < number){
      search(data, mid+1, last, number);
    }
}

int main()
{
    int data[] = {0, 1, 2, 2, 4, 4, 5, 8, 9, 9};
        int len = sizeof(data) / sizeof(data);
        int x = search(data, 0, len-1, 5);
        printf("%d\n", x);
        system("pause");
        return 0;
}





main中打印的值是8,然后在search函数中打印的Mid的值是6,用的是code::blocks编译器









来智慧 发表于 2020-8-22 09:11:15

附上我的终端打印结果:
6 5 6 6
8
请按任意键继续. . .

qq1256740918 发表于 2020-8-25 14:51:41

因为你这个二分查找,只找了一次。

qq1256740918 发表于 2020-8-25 14:52:44

虽然有递归地查找,但是递归结果没有返回给自己,所以白白递归了。

qq1256740918 发表于 2020-8-25 15:01:10

下面附上二分搜索迭代版的代码
int binary_search(int* array, int l, int r, int target)
{
    /*
      在数组下标为 的区间内搜索 target
    */

    static int mid;
    while(l <= r)
    {
      mid = (l + r) >> 1;

      if(array == target)
            return mid;
      else if(array < target)
            l = mid + 1;
      else
            r = mid - 1;
    }

    return -1;
}
请注意搜索区间开闭的区别

来智慧 发表于 2020-8-30 19:04:23

qq1256740918 发表于 2020-8-25 14:52
虽然有递归地查找,但是递归结果没有返回给自己,所以白白递归了。

啥意思?不是用了一个变量保存函数的返回值了吗?

qq1256740918 发表于 2020-8-30 20:26:34

来智慧 发表于 2020-8-30 19:04
啥意思?不是用了一个变量保存函数的返回值了吗?

在大于(小于)的分支里,没有返回

baige 发表于 2020-8-30 20:39:47

递归到return mid;之后就会回溯

baige 发表于 2020-8-30 20:42:13

本帖最后由 baige 于 2020-8-30 20:46 编辑

打错了
页: [1]
查看完整版本: 自己写了个二分查找,但是函数里的打印信息和main里打印的值不一样,大家进来看一下!!