当前位置:首页 » 《关注互联网》 » 正文

轻松拿捏C语言——二分查找

8 人参与  2024年05月25日 19:12  分类 : 《关注互联网》  评论

点击全文阅读


?欢迎关注 轻松拿捏C语言系列,来和 小哇 一起进步!✊

?感谢大家的阅读、点赞、收藏和关注?


目录?

 一、介绍?

二、步骤?

三、代码☀️


 

 一、介绍

二分查找是一种在有序数组中查找某一特定元素的搜索算法。

举个生活中的例子,当我们要去图书馆借书时,知道了要找的图书编号,我们可以在一个大致范围的中间查找,然后在决定往前找还是往后找。这样就能比一本一本地找更加快速。

搜索过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束;

如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。

如果在某一步骤数组为空,则代表找不到。这种搜索算法每一次比较都使搜索范围缩小一半。

二、步骤

确定搜索范围,即数组的下标范围left和right。计算中间元素的下标mid = (left + right) / 2(注意整数除法)。

        但是像这样求平均值,如果数字太大了超过int类型能表示的最大范围,这种算法就会有问题,整数会溢出。

        所以我们可以换一个思路,把两数的差值的一半 加到另一个数字中:

        mid = left + (right-left) /2 

判断中间元素与目标值的大小关系。 如果相等,则返回中间元素的下标。如果目标值小于中间元素,则在左半部分继续搜索(right = mid - 1)。如果目标值大于中间元素,则在右半部分继续搜索(left = mid + 1)。如果搜索范围left大于right,则表示数组中没有目标值,返回-1或其他表示未找到的值。

三、代码

法一:用递归实现

#include <stdio.h>    int Sort(int arr[], int left, int right, int Key) {      if (left > right)         return -1; // 搜索范围无效      int mid = left + (right - left) / 2;  //这种写法可避免溢出    if (arr[mid] == Key)     {          return mid; // 找到目标,返回下标      }     else if (arr[mid] > Key)     {          return Sort(arr, left, mid - 1, Key); // 在左半部分继续搜索      }     else     {          return Sort(arr, mid + 1, right, Key); // 在右半部分继续搜索      }  }    int main() {      int arr[] = {1, 3, 5, 7, 9};      int key = 5;      int n = sizeof(arr) / sizeof(arr[0]);      int ret = Sort(arr, 0, n - 1, key);      if (ret != -1)     {          printf("元素 %d 在数组中的下标为 %d\n", key, ret);      }     else     {          printf("元素 %d 不在数组中\n",key);      }      return 0;  }

法二:用循环实现

#include <stdio.h>    int Sort(int arr[], int N, int Key) {      int left = 0;    int right = N - 1;      while (left <= right)     {          int mid = left + (right - left) / 2;          if (arr[mid] == Key)         {              return mid;          }         else if (arr[mid] > Key)        {              right = mid - 1;          }        else        {              left = mid + 1;          }      }      return -1; // 未找到目标值  }    int main(){      int arr[] = {1, 3, 5, 7, 9};      int key = 5;      int n = sizeof(arr) / sizeof(arr[0]);      int ret = Sort(arr, n, key);      if (ret != -1)     {          printf("元素 %d 在数组中的下标为 %d\n", key, ret);      }     else     {          printf("元素 %d 不在数组中\n",key);      }      return 0;   }

使用循环的方式来实现二分查找,更直观且易于理解。

不过,递归的方式在某些情况下可能更简洁。

无论使用哪种方式,都需要确保数组是有序的,因为二分查找的前提是有序数组。 


 

 ???本文内容结束啦,希望各位大佬多多指教!

??感谢大家三连支持

?敬请期待下篇文章吧~


点击全文阅读


本文链接:http://zhangshiyu.com/post/113589.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

最新文章

  • 秦见鹿谢梵声(我在回忆里万劫不复结局后续+番外)完结_(秦见鹿谢梵声)列表_笔趣阁(我在回忆里万劫不复结局后续+番外)
  • 秦见鹿谢棠梨谢梵声(谢梵声秦见鹿谢棠梨结局+番外)结局_(秦见鹿谢棠梨谢梵声谢梵声秦见鹿谢棠梨结局+番外全书结局)结局列表_笔趣阁(秦见鹿谢棠梨谢梵声)
  • (番外)+(结局)秦见鹿谢梵声(我在回忆里万劫不复结局后续+番外)_(秦见鹿谢梵声)列表_笔趣阁(我在回忆里万劫不复结局后续+番外)
  • 与卿知全书+后续+结局(沈蕴萧岐)列表_与卿知全书+后续+结局(沈蕴萧岐)与卿知全书+后续+结局在线
  • [山雨欲来风满楼]最新章节在线阅读_梁诗予顾念安江以川小说精彩节选试读
  • 爱到最后是放手结局+番外+后续(苏南星沈叙白)全书免费_(苏南星沈叙白)爱到最后是放手结局+番外+后续后续(苏南星沈叙白)
  • 姜栀的他的月光永远西沉精心打造姜栀季柏燃全书在线
  • 爱已成灰情深绝节选高光片段速递‌_纪修宴宋韵小悦后续已完结
  • 重生后我放弃成为护国公主,书遥苏月心番外+完结书遥
  • 重生后我放弃成为护国公主,书遥苏月心_重生后我放弃成为护国公主,书遥苏月心
  • 往梦难复温在线品鉴(沈淮霆宋思予)_往梦难复温在线品鉴(沈淮霆宋思予)
  • [be后我成了女友的白月光]小说精彩章节试读_「陆千屿别庄连闯」完结版全文

    关于我们 | 我要投稿 | 免责申明

    Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1