【C语言】二分法查找——————细节讲解

简介: 概念二分法查找,是一种在有序数组中快速目标数字的一种算法,也可以叫做折半查找。要掌握二分法查找,首先我们要明白二分法查找是怎么运作的,为什么要用二分法查找。
  • 概念

二分法查找,是一种在有序数组中快速目标数字的一种算法,也可以叫做折半查找

要掌握二分法查找,首先我们要明白二分法查找是怎么运作的,为什么要用二分法查找。02de1e57a19642f1ac4929ad6644ff45.png

  • 这里有一个数组,共有十个元素,我们想找到其中一个元素,按照传统遍历的办法,我们写一个循环那么最多要循环十次,但是如果我们用二分法查找的话最多只用4次循环就可以做到。
    传统办法代码示例:
  int arr[10] = { 0,1,2,3,4,5,6,7,8,9 };//定义数组
  int n = 0;
  scanf("%d", &n);//输入要查找的数字
  for (int i = 0; i < 10; i++)//从头到尾遍历查找
  {
    if (arr[i] == n) 
    {
      printf("找到了,位置在下标%d", i);
      break;
    }
  }

二分法查找讲解

2e54ba0dbc6144a7a3ffe0f00a1f10f5.png

二分法查找的精髓就是如果没查询到,下次将数据折半再进行查找,大大提高效率,,那么如果想砍掉一半数据,最重要的就是找到中间的数字,比如下图,我们想找的是2,那么我们先拿到中间数字5与2进行比较,5比2大,所以要找的肯定不是5右面的数(因为是有序数组),所以将5右面的数包括5一起pass掉

9bb5dc9b08604bc0931584f3ac27063a.png

接下来我们继续在下标0-3的数字上进行查找中间数字为2,查找成功。

  • 对于定位中间数,我们可以采用 最大的下标+最小的下标/2

于是便有了二分法查找必不可少的三个变量

left始化为0,因为最小的下标肯定是0
right ,sizeof(arr) / sizeof(arr[0]) - 1
mid ,(left + right) / 2,其中left和right的存在都是为了找出mid

  • 有了这三个变量,问题就变得简单了,只要每次折半后修改left或者right的位置,然后产生新的mid,二分法查找就写好了
#include <stdio.h>
int main()
{
  int arr[10] = { 11,22,33,44,55,66,77,88,99,101 };//定义要查找的数组
  int sz = sizeof(arr) / sizeof(arr[0]);//数组大小
  int left = 0; //关键变量left用于定位范围左边
  int right = sz - 1;//关键变量right用于定位范围右面
  int mid = left + (right - left) / 2;//关键变量mid用于定位范围中间
  int input = 0;
  int flag = 0;//标记循环结束后是否找到数字
  scanf("%d", &input);//输入要查找的数字
  while (left <= right)
  {
    if (input > arr[mid])//如果要查找的数字大于中间数,砍掉左半边
    {
      left = mid + 1;//将左范围更正到原mid右一位
      mid = left + (right - left) / 2;//将范围中间数更新
    }
    else if(input <arr[mid])//如果要查找的书数字小于中间数,砍掉右半边
    {
      right = mid - 1;//更新右范围为原mid左一位
      mid = left + (right - left) / 2;//将范围中间数更新
    }
    else//如果既不大于也不小于,则为等于,找到数字    
    {
      flag = 1;//将标记改为1
      printf("找到了坐标为%d",mid);
      break;//跳出程序
    }
  }
  if (flag == 0)//如果标记在循环中没有被修改,则证明没找到
  {
    printf("没找到");
  }
}

总结

二分法查找其实很简单,主要就是找到中间数,每次进行折半即可。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3EXSYx5O-1677661166102)(https://img-home.csdnimg.cn/images/20220524100510.png =60x60)]
















相关文章
|
JavaScript 前端开发 Java
11 个最佳的 Python 编译器和解释器
11 个最佳的 Python 编译器和解释器
835 1
|
安全 应用服务中间件 网络安全
VM tomcat启动成功,但是访问不到tomcat欢迎页
VM tomcat启动成功,但是访问不到tomcat欢迎页
717 0
VM tomcat启动成功,但是访问不到tomcat欢迎页
|
12月前
|
JavaScript 前端开发 Python
python中的platform模块的基本使用
欢迎来到瑞雨溪的博客,一名热爱JavaScript与Vue的大一学生。博客分享前端技术,助你成长。关注我,持续更新中!🎉🎉🎉
231 0
|
前端开发 JavaScript Java
基于Java+Springboot+Vue开发的新闻管理系统
基于Java+Springboot+Vue开发的新闻管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Java的新闻管理系统项目,大学生可以在实践中学习和提升自己的能力,为以后的职业发展打下坚实基础。
618 3
基于Java+Springboot+Vue开发的新闻管理系统
|
资源调度 算法
深入理解网络中的死锁和活锁现象
【8月更文挑战第24天】
648 0
|
SQL NoSQL 关系型数据库
Seata常见问题之Seata报错Unknown SQLExpr如何解决
Seata 是一个开源的分布式事务解决方案,旨在提供高效且简单的事务协调机制,以解决微服务架构下跨服务调用(分布式场景)的一致性问题。以下是Seata常见问题的一个合集
|
JavaScript Java 测试技术
基于ssm+vue.js+uniapp小程序的天气预报管理系统附带文章和源代码部署视频讲解等
基于ssm+vue.js+uniapp小程序的天气预报管理系统附带文章和源代码部署视频讲解等
209 3
|
负载均衡 NoSQL 关系型数据库
Nginx+keepalived实现高可用集群
大型企业架构一般是用户先访问到四层负载均衡,在由四层负载均衡转发至七层服务在均衡,七层负载均衡再转发至后端服务器,四层负载均衡只起到一个分流的作用,根据用户访问的端口,比如说80端口就会跳转至七层的对应的集群,两台四层负载均衡配置是一模一样的,形成高可用,七层的配置也是一模一样的,当有1500个请求需要响应时,四层负载均衡就会平均将1500个请求分给急群中的lb,每个lb响应500个请求,减轻单点的压力。
1980 0
Nginx+keepalived实现高可用集群
|
程序员 Shell C语言
【C/C++ main函数】深入探索C++中的main函数及其参数
【C/C++ main函数】深入探索C++中的main函数及其参数
1569 0
|
自然语言处理 编译器 调度
深入gcc编译器:C/C++代码如何变为可执行程序
深入gcc编译器:C/C++代码如何变为可执行程序
410 0