二分查找——“C”

news2024/11/15 16:01:41

各位CSDN的uu们你们好呀,欢迎来到小雅兰的课堂,今天我们的内容是复习之前的内容,并把之前的内容的一些习题一起来做一做,现在,就让我们进入二分查找的世界吧

首先,我们介绍的题目就是二分查找,也叫折半查找

我们定义了一个整型数组,为1 2 3 4 5 6 7 8 9 10,这个数组所有元素的下标为0 1 2 3 4 5 6 7 8 9,然后定义下标为0的元素为left,定义下标为9的元素为right,中间元素为mid 

 我们先假设要查找的元素就是7,那么就可以写出这样一个式子:mid=(left+right)/2;然后再进行二分查找,由下图可知,用二分查找的方式找到7这个元素最多只需要查找4次这样的效率远比遍历的方法的效率要高

下面,我们来用代码来实现一下此功能吧

#include<stdio.h>
int main()
{
   int arr[]={1,2,3,4,5,6,7,8,9,10};
            //0,1,2,3,4,5,6,7,8,9
   int k=7;//k是要查找的数字
   int sz=sizeof(arr)/sizeof(arr[0]);
   //折半查找(二分查找),前提是数组有序
   int left=0;
   int right=sz-1;
   int flag=0;//一个标记变量
   while(left<=right)
   {
      int mid=(left+right)/2;
      if(arr[mid]<k)
      {
         left=mid+1;
      }
      else if(arr[mid]>k)
      {
         right=mid-1;
      }
      else
      {
         printf("找到了,下标是:%d\n",mid);
         flag=1;
         break;
      }
   }
   if(flag==0)
   {
      printf("找不到\n");
   }
   return 0;
}

然后,我们来运行一些此代码

 写到这里,我们不禁会想起一个问题:如果这个数组非常非常大怎么办?

如果这个数组非常非常大,left和right非常大,left没有超出整型范围的最大值,right也没有超过整型范围的最大值,但left+right的和超出了整形范围的最大值,就会造成溢出现象,溢出之后的数据再除以2,就不是平均值了,所以mid=(left+right)/2这样的写法还是存在潜在风险

我们可以这样写:mid=left+(right-left)/2;

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
    int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
                //0,1,2,3,4,5,6,7,8,9
    int k = 7;//k是要查找的数字
    scanf("%d", &k);
    int sz = sizeof(arr) / sizeof(arr[0]);
    //折半查找(二分查找),前提是数组有序
    int left = 0;
    int right = sz - 1;
    int flag = 0;//一个标记变量
    while (left <= right)
    {
        int mid = left+(right-left) / 2;
        if (arr[mid] < k)
        {
            left = mid + 1;
        }
        else if (arr[mid] > k)
        {
            right = mid - 1;
        }
        else
        {
            printf("找到了,下标是:%d\n", mid);
            flag = 1;
            break;
        }
    }
    if (flag == 0)
    {
        printf("找不到\n");
    }
    return 0;
}

最后的结果也是非常正确的

 我们再来研究研究,前段时间我们学习了“函数”这一知识点,那我们也是可以封装一个函数来实现此代码的,那好吧,一起来实操一下

#include<stdio.h>
int binary_search(int arr[],int k,int sz)
{
   int left=0;
   int right=sz-1;
   while(left<=right)
   {
      int mid=left+(right-left)/2;
      if(arr[mid]>k)
      {
         right=mid-1;
      }
      else if(arr[mid]<k)
      {
         left=mid+1;
      }
      else
      {
         return mid;
      }
   }
   return -1;
}
int main()
{
   int arr[]={1,2,3,4,5,6,7,8,9,10};
   int k=0;
   scanf("%d",&k);
   int sz=sizeof(arr)/sizeof(arr[0]);
   //找到了就返回下标,找不到就返回-1
   int ret=binary_search(arr,k,sz);
   if(ret==-1)
   {
      printf("找不到\n");
   }
   else
   {
      printf("找到了,下标是:%d\n",ret);
   }
   return 0;
}

好啦,用封装函数的方法也实现啦

 那么,可能又会有人突发奇想,说:“可不可以把sz放在函数内部来求呢?”这个答案当然是否定

它的代码是这个样子

#include<stdio.h>
int binary_search(int arr[], int k)
{
    int left = 0;
    int sz = sizeof(arr) / sizeof(arr[0]);
    int right = sz - 1;
    while (left <= right)
    {
        int mid = left + (right - left) / 2;
        if (arr[mid] > k)
        {
            right = mid - 1;
        }
        else if (arr[mid] < k)
        {
            left = mid + 1;
        }
        else
        {
            return mid;
        }
    }
    return -1;
}
int main()
{
    int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
    int k = 0;
    scanf("%d", &k);
    //找到了就返回下标,找不到就返回-1
    int ret = binary_search(arr, k);
    if (ret == -1)
    {
        printf("找不到\n");
    }
    else
    {
        printf("找到了,下标是:%d\n", ret);
    }
    return 0;
}

你运行起来,会发现,无论输入2之后的任意数字,输出的结果都是找不到

 

 因为:arr是数组名,进行函数传参的时候,传进来的是首元素的地址,在binary_search()函数的形参中,arr实质上是一个指针,sizeof(arr)只是算出来这个首元素的地址所占空间大小,sizeof(arr[0])是这个元素占的空间大小,两者相除必为1.

而在主函数中求sz,sizeod(数组名) 计算的是整个数组的大小

    sizeof内部单独放一个数组名,数组名表示整个数组


好啦,小雅兰今天的内容就到这里啦,今天的内容可能比较简单,也很少,但是小雅兰有认真在学噢!!!uu们加油呀

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/175674.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

module ‘tensorflow‘ has no attribute ‘Session‘

1. module ‘tensorflow‘ has no attribute ‘Session‘ 指定一个会话来运行tensorflow程序&#xff0c;在使用tensorflow1.x版本中用tensorflow.Session即可 但当我的库版本升级到2.x之后&#xff0c;就会出现标题式报错&#xff0c;于是我去查看了tensorflow库的源码&…

使用Keras搭建深度学习模型

前言 目前深度学习领域的主流框架 tensorflowkeraspytorchcaffetheanopaddlepaddle keras 代码架构 keras代码风格相比于其他框架更符合人的思维。 模型 模型的组成分为三部分&#xff1a;输入层、网络层、输出层。 输入层 输入层的作用时规定了模型输入的shape fro…

2022年智源社区年度热点推荐丨新春集锦

本文为2022年最受智源社区小伙伴喜爱的文章&#xff0c;根据文章质量和热门程度等维度计算得出。还有AI大佬的全年总结盘点总结&#xff0c;也一并推荐给你。虎年除旧&#xff0c;兔年迎新&#xff0c;藉此机会、智源编辑组全员谨祝大家新春快乐&#xff01;2022智源社区20篇最…

LINUX学习之网络配置(十一)

1.修改IP地址 使用ifconfig命令 例如要将eth0接口的IP地址更改为192.168.1.100&#xff0c;你可以使用以下命令 ifconfig eth0 192.168.1.100如果你想为IP地址设置子网掩码&#xff0c;可以使用“netmask”参数。例如&#xff0c;要将eth0接口的子网掩码设置为255.255.255.0…

[Linux]进程优先级 Linux中的环境变量

&#x1f941;作者&#xff1a; 华丞臧. &#x1f4d5;​​​​专栏&#xff1a;【LINUX】 各位读者老爷如果觉得博主写的不错&#xff0c;请诸位多多支持(点赞收藏关注)。如果有错误的地方&#xff0c;欢迎在评论区指出。 推荐一款刷题网站 &#x1f449; LeetCode刷题网站 文…

liunx centos9中安装Redis数据库,并在win10中连接redis图文详解

首先我们去Redis的官网点击download下载tar的压缩包 https://redis.io/download/#redis-downloads 用xftp将安装包上传到你的liunx服务器本地地址 解压 tar -xvf /root/redis-7.0.8.tar.gz cd进入你刚才解压的文件夹中 cd /root/redis-7.0.8 执行make进行编译 编译完成后cd进入…

普中科技MicroPython基于esp32的基础教程-03-字符串

目录 字符串 字符串的表示方式 普通字符串 原始字符串 长字符串 字符串与数字相互转换 将字符串转换为数字 将数字转换为字符串 格式化字符串 占位符% format方法 f-strings 操作字符串 字符串拼接 字符串查找 字符串替换 字符串分割 去处字符串两…

目标检测:Focal Loss

目标检测&#xff1a;Focal Loss前言Focal LossCross Entropybalanced Cross EntropyFocal Loss Definition前言 Focal loss这个idea来源于论文《Focal Loss for Dense Object Detection》,主要是为了解决正负样本、难易样本不平衡的问题。 Focal Loss Cross Entropy 在目标…

不懂Pod?不足以谈K8s

文章目录✨ 前言1. myblog改造及优化2. Pod生命周期&#x1f351; 如何编写资源 yaml&#x1f351; pod状态与生命周期3. Pod操作总结✨ 前言 在上一篇文章中&#xff0c;我们学习了 Pod 的常用设置&#xff0c;那么这篇文章咱们继续开动&#xff01; K8s落地实践之旅 —— P…

LabVIEW异步调用VI的多个实例实现并行执行

LabVIEW异步调用VI的多个实例实现并行执行默认情况下&#xff0c;如对一个VI进行多个异步调用&#xff0c;LabVIEW将这些调用按顺序排列&#xff0c;依次执行。各个调用的执行时间累加&#xff0c;效率不高。按照下列步骤&#xff0c;并行执行各个调用&#xff0c;避免一个调用…

Python小技巧:__str__()的妙用

前言 这里是Python小技巧的系列文章。这是第三篇&#xff0c;object.__str__(self)方法的妙用。 书接上回&#xff0c;这次还是介绍Python类的内置方法&#xff0c;__str__() 据官方文档的介绍&#xff0c;在使用 str(object) 、format() 和 print() 的时候会调用__str__() 方…

一文搞懂go并发编程设计原理

前言 主要学习其设计原则&#xff0c;大体流程&#xff0c;权衡利弊 不要纠结于部分难懂的实现细节&#xff0c;因为不同的人对相同接口的实现细节不一样&#xff0c;就算是相同的人实现两次也可能不一样 context context的作用主要有两个&#xff1a; 在整个请求的执行过程…

stm32 笔记 PWM输入模式测量脉宽和占空比原理

一、PWM 输入模式测量脉宽 1.1 测量脉宽简介 在测量占空比之前&#xff0c;我们先一步一步来&#xff0c;先让 STM32 可以测量脉宽。 TIM3_CH1&#xff08;tim3 定时器通道 1&#xff09;捕获模式测量脉宽步骤如下&#xff1a; 1.输入捕获到 PWM 上升沿触发 2.发送中断&am…

机器视觉_HALCON_快速向导_2.用HALCON开发程序

文章目录使用HALCON开发应用程序1. 认识HALCON&#xff1a;架构&数据结构1.1. HALCON算子1.2. 参数与数据结构1.2.1. Images 图像1.2.2. Regions 区域1.2.3. XLDS 扩展线1.2.4. Handles 句柄1.2.5. Tuple Mode 元组模式1.3. HALCON与并行编程1.4. HALCON支持计算设备1.5. H…

grant之后要跟着flush privileges吗?

在 MySQL 里面,grant 语句是用来给用户赋权的。不知道你有没有见过一些操作文档里面提到,grant 之后要马上跟着执行一个 flush privileges 命令,才能使赋权语句生效。我最开始使用 MySQL 的时候,就是照着一个操作文档的说明按照这个顺序操作的。 那么,grant 之后真的需要…

33.Isaac教程--操纵运动学

操纵运动学 ISAAC教程合集地址文章目录操纵运动学应用架构实施细节正向运动学逆运动学小码为了控制机器人手臂的运动&#xff0c;需要数学表示法来计算执行器输入并为轨迹规划器表示障碍物。 为实现这一点&#xff0c;操纵运动学 GEM 将铰接式机器人系统表示为连接的刚体&#…

Linux常用命令——sudo命令

在线Linux命令查询工具(http://www.lzltool.com/LinuxCommand) sudo 以其他身份来执行命令 补充说明 sudo命令用来以其他身份来执行命令&#xff0c;预设的身份为root。在/etc/sudoers中设置了可执行sudo指令的用户。若其未经授权的用户企图使用sudo&#xff0c;则会发出警…

pytorch深度学习基础(九)——深入浅析卷积核

深入浅析卷积核引言单通道卷积简单图像边缘检测锐化高斯滤波引言 提到卷积&#xff0c;应该多数人都会想到类似上图的这种示例&#xff0c;可以简单的理解成卷积核与图像中和卷积核相同大小的一块区域与卷积核相乘再求和&#xff0c;通过移动区域产生一个有和组成的新的图像&am…

Python烟花秀

前言 Python跨年烟花表演&#xff0c;具体源码见&#xff1a;Python跨年烟花代码-Python文档类资源-CSDN下载 烟花的粒子类 class particle: #烟花的粒子类 def __init__(self,canvas,num,sums,x,y,x_speed,y_speed,explosion_speed,color,size,max_life): sel…

第四章必备前端基础知识-第二节2:CSS属性

文章目录一&#xff1a;CSS属性一览表二&#xff1a;常用属性详解&#xff08;1&#xff09;字体属性&#xff08;2&#xff09;文本属性&#xff08;3&#xff09;背景属性一&#xff1a;CSS属性一览表 W3C&#xff1a;元素属性 A&#xff1a; align-content规定弹性容器内…