鱼C论坛

 找回密码
 立即注册
查看: 2216|回复: 8

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

[复制链接]
发表于 2020-8-22 09:08:00 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>

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

  8.     if(data[mid] == number){
  9.         printf("%d %d %d %d\n", mid, data[mid], first, last);
  10.         return mid;
  11.     }
  12.     if(first >= last){
  13.         return -1;
  14.     }
  15.     if(data[mid] > number){
  16.         search(data, first, mid-1, number);
  17.     }
  18.     if(data[mid] < number){
  19.         search(data, mid+1, last, number);
  20.     }
  21. }

  22. int main()
  23. {
  24.     int data[] = {0, 1, 2, 2, 4, 4, 5, 8, 9, 9};
  25.         int len = sizeof(data) / sizeof(data[0]);
  26.         int x = search(data, 0, len-1, 5);
  27.         printf("%d\n", x);
  28.         system("pause");
  29.         return 0;
  30. }
复制代码





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









小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-8-22 09:11:15 | 显示全部楼层
附上我的终端打印结果:
6 5 6 6
8
请按任意键继续. . .
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-25 14:51:41 | 显示全部楼层
因为你这个二分查找,只找了一次。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-25 14:52:44 | 显示全部楼层
虽然有递归地查找,但是递归结果没有返回给自己,所以白白递归了。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-25 15:01:10 | 显示全部楼层
下面附上二分搜索迭代版的代码
  1. int binary_search(int* array, int l, int r, int target)
  2. {
  3.     /*
  4.         在数组下标为 [l, r] 的区间内搜索 target
  5.     */

  6.     static int mid;
  7.     while(l <= r)
  8.     {
  9.         mid = (l + r) >> 1;

  10.         if(array[mid] == target)
  11.             return mid;
  12.         else if(array[mid] < target)
  13.             l = mid + 1;
  14.         else
  15.             r = mid - 1;
  16.     }

  17.     return -1;
  18. }
复制代码

请注意搜索区间开闭的区别
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-30 19:04:23 | 显示全部楼层
qq1256740918 发表于 2020-8-25 14:52
虽然有递归地查找,但是递归结果没有返回给自己,所以白白递归了。

啥意思?不是用了一个变量保存函数的返回值了吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-30 20:26:34 | 显示全部楼层
来智慧 发表于 2020-8-30 19:04
啥意思?不是用了一个变量保存函数的返回值了吗?

在大于(小于)的分支里,没有返回
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-30 20:39:47 | 显示全部楼层
递归到return mid;之后就会回溯
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-30 20:42:13 | 显示全部楼层
本帖最后由 baige 于 2020-8-30 20:46 编辑

打错了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-7-12 15:17

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表