当前位置: 首页 > news >正文

数组算法--二分查找

目录

一.前言

二.算法的核心思路

三.算法的核心代码以注释详解


一.前言

        二分查找也叫折中查找,为什么会这样叫呢?就是因为我们二分查找的核心逻辑就是每查找完一次,都能将查找的范围给缩小一半,也就是折中。但使用二分查找又有个很大的前提,那就是该数组里的元素得是有序排序的,也就是从小到大排序或者从大到小排序。

二.算法的核心思路

        首先我们以一个从小到大进行排序的数组{3,4,5,6,7,8}为例,二分算法之所以能够每次将范围缩小一半就是因为它设置了中间值,我们把它命名为mid。

        接着我们明确下我们要查找的范围,也就是设置一个最左边的值,设为min,它的值会是索引号0。设置一个最右边的值为max,它的值就会是数组长度减一。而我们的mid值就是对这两者进行求和再除以2的结果。

        在这个例子中,我们的min=0,max=6-1=5,mid=(0+5)/2=2。它们值也就是索引值。

        接着我们只需要拿数组中索引值为mid的数据来和我们要查找的数据进行大小对比即可。要是数据大于mid的数据,且我们这里是按照从小到大进行排序的,所以我们就能确定我们要查找的数据在我们的mid和max中间。

        这个时候我们就可以缩小范围,让min等于mid的值加一,max保持不变,mid还是min和max两者求和后的一半。

        同理,要是小于mid的数据,就让min保持不变,max的值等于mid减一。达到一个每查找一次就能将范围缩小一半的效果,同时,因为mid已经和要查找的数据进行对比过了,所以我们每次更改min和max的值时候,就需要加一或者减一。

三.算法的核心代码以注释详解

#include<stdio.h>
int binaryFind(int arr[], int len, int num);int main() {//给定一个有序的数组和要查找的数,对它进行二分查找。int arr[] = {11,22,33,44,55,66,77};int len = sizeof(arr) / sizeof(int);//定义一个num变量用来存放要查找的数据int num = 66;//定义一个变量来接收函数传递过来的索引int index = binaryFind(arr, len, num);printf("%d\n", index);return 0;
}int binaryFind(int arr[], int len,int num) {	//别忘了声明函数//设置min和max的初始值int min = 0;int max = len - 1;//我们查找结束的条件就是当min>max的时候,这表示查完数组中所有的元素都没有满足的。while (min <= max) {//每次比较完更新mid的值int mid = (min + max) / 2;//判断完之后来决定范围的更新。if (arr[mid] < num) {   //表示要查找的数据在mid的右边,如果是从大到小排序的,则是在左边。min = mid + 1;}else if (arr[mid] > num) {	//在mid的左边,更新max的值来缩小范围。max = mid - 1;}//这种情况是刚好mid索引处的值等于要查找的数据else {return mid;}}return -1;
}

下面我们来看下运行的结果:

 

这里的5表示我们要查找的数据在数组中的索引值为5的地方。 

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • php 做一个mqtt按钮,发布触发信号
  • Unity UGUI 之 Input Field
  • 深入浅出WebRTC—Pacer
  • elementPuls 表格反选实现
  • 【LLM】-07-提示工程-聊天机器人
  • HarmonyOS应用开发者高级认证,Next版本发布后最新题库 - 答案纯享版
  • Git添加和提交文件
  • [亲测可用]俄罗斯方块H5-网页小游戏源码-HTML源码
  • 优选算法之二分查找(上)
  • 【Matlab 传感器布局优化】基于群智能算法的wsn覆盖优化研究
  • 飞书群聊机器人自定义机器人接入,并实现艾特@群成员功能
  • 机器学习 | 回归算法原理——多项式回归
  • 网络学习|如何理解服务的端口号
  • Jenkins+Gitlab持续集成综合实战
  • 基于HAL库的stm32的OLED显示屏显示(IIC)
  • 自己简单写的 事件订阅机制
  • canvas 高仿 Apple Watch 表盘
  • es6(二):字符串的扩展
  • ES6--对象的扩展
  • java8-模拟hadoop
  • Mac 鼠须管 Rime 输入法 安装五笔输入法 教程
  • REST架构的思考
  • tweak 支持第三方库
  • 关于springcloud Gateway中的限流
  • 微信小程序设置上一页数据
  • nb
  • ​马来语翻译中文去哪比较好?
  • ​人工智能之父图灵诞辰纪念日,一起来看最受读者欢迎的AI技术好书
  • # linux 中使用 visudo 命令,怎么保存退出?
  • # Redis 入门到精通(八)-- 服务器配置-redis.conf配置与高级数据类型
  • #【QT 5 调试软件后,发布相关:软件生成exe文件 + 文件打包】
  • #pragma once与条件编译
  • (12)Hive调优——count distinct去重优化
  • (delphi11最新学习资料) Object Pascal 学习笔记---第2章第五节(日期和时间)
  • (java)关于Thread的挂起和恢复
  • (LeetCode 49)Anagrams
  • (SpringBoot)第二章:Spring创建和使用
  • (附源码)springboot学生选课系统 毕业设计 612555
  • (转)Sublime Text3配置Lua运行环境
  • *p=a是把a的值赋给p,p=a是把a的地址赋给p。
  • ../depcomp: line 571: exec: g++: not found
  • .gitignore文件_Git:.gitignore
  • .Net 6.0--通用帮助类--FileHelper
  • .NET CF命令行调试器MDbg入门(四) Attaching to Processes
  • .net core IResultFilter 的 OnResultExecuted和OnResultExecuting的区别
  • .NET Framework 4.6.2改进了WPF和安全性
  • .net mvc 获取url中controller和action
  • .NET MVC之AOP
  • @ohos.systemParameterEnhance系统参数接口调用:控制设备硬件(执行shell命令方式)
  • @ResponseBody
  • [ element-ui:table ] 设置table中某些行数据禁止被选中,通过selectable 定义方法解决
  • [ web基础篇 ] Burp Suite 爆破 Basic 认证密码
  • [20170705]diff比较执行结果的内容.txt
  • [2019.2.28]BZOJ4033 [HAOI2015]树上染色
  • [240812] X-CMD 发布 v0.4.5:更新 gtb、cd、chat、hashdir 模块功能