超详解“二分法查找”,一看就会!

2023-10-31

目录

一、 二分法概念用途

二、 超详思维图解

三、  超详使用方法实现代码运行操作

四、   总结

五、   结语

一:二分法概念用途

 什么是二分法?有什么作用?一般用在何处?

概念:二分查找法算法,也叫折半查找算法(对半处理会提高寻找目标数字的效率);

作用:在一串有序的数字中,能快速寻找到你输入的数字,是一种很高效的查询算法。注意!!使用二分查找要求数组数据必须采用顺序存储结构有序排列。

!!!接下来注意咯

二:使用思维

思维:首先找出这串有序数字的中间值,每次都跟区间的中间值进行对比,将查找的区间缩小成之前的一半,进行二次与中间值对比,再次将查找的区间缩小到之前的一半,直到找到你要查找的元素为止,是不是很简单呢?实质就一个这么简单的思维。

详细图解如下

 

三:使用方法实现代码运行操作

废话不多说上代码

1.定义变量

	int arr[] = { 1,2,3,4,5,6,7,8,9,10,11 };
	int n = 0;
	int sz = sizeof(arr) / size(arr[0]);
	int left = 0;
	int right = sz - 1;

    int arr[] = { 1,2,3,4,5,6,7,8,9,10,11 };  用数组表示这组有序数字
    int n = 0;                                            定义即将寻找数数的变量
    int sz = sizeof(arr) / size(arr[0]);        元素的个数(  sz后面单独解释)
    int left = 0;                                         区间最左边的数字
    int right = sz - 1;                                区间最右边的数字

    int mid = (left + right) / 2;                   定义一个中间值,中间值=(最左边加最右边)÷ 2

    int  sz = sizeof(arr) / size(arr[0]);的单独解解释: 

!!sizeof  求空间大小用的

记公式!!! sizeof= 类型元素所占字节数  ×  元素个数

se是int 类型,一个元素占四个字节,那sizeof (arr) 内有11个元素,所以sizeof(arr)  共占44个字节

                                                                                                                                      4×11=44

                                                               sizeof(arr[ 0])内有一个元素,所以size(arr[0])共占4字节

                                                                                                                                       4×1=4

        所以 sz = sizeof(arr) / size(arr[0])=  44÷  4  =11;

2.

while (left <= right)
	{
		if (arr[mid] > n)
		{
			right = mid - 1;
		}
		else if (arr[mid] < n)
		{
			left = mid + 1;
		}
		else
		{
			printf("找到了,下标是: %d\n", mid);
			break;
		}
	}
	if(left > right)
	    printf("找不到!\n");

   if分支表达多种情况???

        中间值mid > 要查找的数,最右边的值right-1,缩小区间范围便于下一次查找

        中间值mid < 要查找的数,最左边的值left+1,缩小区间范围便于下一次查找

        中间值mid = 要查找的数,恭喜你,找到了!!

        if   (left > right)      (查找的数不在数组元素之内,就找不到)
            printf("找不到!\n");

while  循环语句???

       a.    因为查找不是一次就能找到,所以加个while 循环语句可以多查找几次,直到找到为止,                break直接跳出循环;

        b.    while语句的条件

                  while (left <= right),left本身是最左数,right本身是最右数,所以一般情况下left<right,中间值就存在。

还有一种情况就是·left=right=mid,最左值等于最右值也就是最后的中间值,此时恭喜你,已找到目标。

               if(left > right),  如果left>right,说明此元素不存在你的查找范围内,因此找不到。

3.    完整代码:

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

4.   总结:二分法往简单里看就是三个步骤:

                                                                   1.    对半折

                                                                   2.     查找中间值( mid)

                                                                   3.     缩小区间(看与mid的关系再决定,往左+1或者往                                                                                                                                                  右-1)

5.   结语:

这是我第一次写博客,希望此文能够帮助到你,如有不足之处,望君留言。

如果本文对你有所帮助,记得点赞关注哟!笔者会持续更新干货,期待与君共勉!!

                                                                 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

超详解“二分法查找”,一看就会! 的相关文章

  • mysql练习:经典50道基础题

    目录 一 环境准备 50道题目练习 1 查询 01 课程比 02 课程成绩高的学生的信息及课程分数 2 查询学生选课存在 01 课程但可能不存在 02 课程的情况 不存在时显示为 null 3 查询平均成绩大于等于 60 分的同学的学生编号
  • jdbc连接超时解决

    这两天在测试Hive权限控制代码Hamza 发现每天来的时候第一次老是会报出以下错误 2015 03 26 09 40 25 956 ERROR GroupPrivController 119 Error querying database
  • spark实验总结

    4 5实验的问题在于spark保存和读取json的时候列名容易不是本来需要的字段名而是c1 c2这样的列名 解决办法是不要用建议读取方法而要指定读取表头 不用spark read csv 而是 spark read format json

随机推荐

  • c++ 使用 math库笔记

    目录 win10系统 cmakelist txt linux gcc方式 c 使用pi win10系统 这个头文件在visual studio的 sdk中 引用方法 include
  • Redis队列实现Java版秒杀系统(无脚本、可用于生产)

    需求是做一个秒杀系统 比如大家来抢100台手机 先到先得 查阅了网上很多用redis实现秒杀的demo java语言 竟然没一个能用的 有些是php的 没闲心研究了 现在说说为什么不能用 绝大多数的DEMO都是基于redis的watch特性
  • java 基础重学(七)-java底层知识/设计模式

    java 底层知识 字节码 class文件格式 CPU缓存 L1 L2 L3和伪共享 尾递归 位运算 位运算实现 设计模式 常用设计模式 单例 单例的七种写法 策略 工厂 适配器 责任链 实现AOP 实现IOC
  • 用CSS3实现div内容无限循环的滚动

    使用CSS3来实现 若要用CSS3的属性实现的话 非animation莫属 因为transition是需要手动的触发 而且不能无限次执行下去 而animation恰好能解决这个问题
  • 二进制的算法题怎么做

    内容会持续更新 有错误的地方欢迎指正 谢谢 告诉大家一个诀窍 能高效解决大多数二进制的题目 假设有一个数n 那么n n 1 的作用 n n 1 得到的结果相当于把整数的二进制表示中最右边的那个1变成0 例1 求二进制数中1的个数 输入一个整
  • 修复Yum依赖冲突

    警告 RPM 数据库已被非 yum 程序修改 发现 个已存在的 RPM 数据库问题 yum check 输出如下 列出重复的包 package cleanup dupes 移除旧的重复包 package cleanup cleandupes
  • Python Import 详解

    import 绝对是我们在使用python时最常用的语句之一了 但其实关于import 需要注意的地方还真不少 如导入第三方库 导入自己写的库 导入相对路径下文件中的方法 在包内部的相对与绝对导入等导入源 有导入的顺序 有Lazy Load
  • 经验:如何快速地写出格雷码

    经验 如何快速地写出格雷码 更新历史 201901212 首次发布 格雷码 Binary Gray Code 的特点是 相邻两个码之间 只相差了一个比特 由于这个特性 格雷码在数字电路中使用甚广 不过 令人尴尬的是 格雷码似乎不好记 以4比
  • C语言数组和指针笔试题(二)(一定要看)

    目录 字符数组二 例题1 例题2 例题3 例题4 例题5 例题6 例题7 总结 字符数组三 例题1 例题2 例题3 例题4 例题5 例题6 例题7 字符数组二 char arr a b c d e f 1 printf d n strlen
  • 黑马程序员MySQL学习笔记一(超详细版)-MySQL基础篇:MySQL概述、SQL、函数、约束、多表查询、事务

    名称 黑马程序员MySQL数据库入门到精通 从MYSQL安装到MYSQL高级 MYSQL优化全囊括 来源 B站黑马程序员 链接 https www bilibili com video BV1Kr4y1i7ru p 37 share sou
  • 区块链之java(六.1) 合约监听

    之前写的那一篇呢 好像有点点问题 就是在设定监听的时候 没有编写具体监听的方法 今天带来一篇新的方式的合约监听 前面的就不赘述了 合约上的监听是一样的 在java中 根据abi生产的文件 其实在里面是有监听方法的 代码如下 public F
  • 服务器如何生成文件夹,服务器如何生成数据库文件夹

    服务器如何生成数据库文件夹 内容精选 换一换 将GaussDB for openGauss 提供的ODBC DRIVER psqlodbcw so 配置到数据源中便可使用 配置数据源需要配置 odbc ini 和 odbcinst ini
  • 二阶振荡环节的谐振频率_自动控制系统时域分析十三:对数频率特性

    一 对数频率特性曲线 波德图 Bode图 Bode图由对数幅频特性和对数相频特性两条曲线组成 波德图坐标 横坐标是频率 纵坐标是幅值和相角 的分度 1 横坐标分度 称为频率轴 它是以频率w的对数值logw进行线性分度的 但为了便于观察仍标以
  • 图书管理系统C语言

    C语言简单编写图书管理系统 两种方法 链表 线性表 主要内容 开发一个图书管理系统 基本信息包括图书的书名 作者 ISBN号 基本实现 输出 输入 删除 查询 插入的基本功能 代码如下 运行结果省略 链表 include
  • 《CTFshow-Web入门》03. Web 21~30

    Web 21 30 索引 web21 题解 原理 web22 题解 原理 web23 题解 原理 web24 题解 原理 web25 题解 原理 web26 题解 web27 题解 web28 题解 web29 题解 原理 web30 题解
  • 【C#基础】C# 文件与IO

    序号 系列文章 9 C 基础 C 异常处理操作 10 C 基础 C 正则表达式 11 C 基础 C 预处理器指令 文章目录 前言 1 文件和IO的概念 2 文本文件操作 2 1 File 类 2 2 FileInfo 类 2 3 FileS
  • 不要消费信任

    消费是一种用来满足人们各种需求的过程 人们可以通过消费来满足吃 穿 住 行等物质上的需求 同样的 人们也可以通过消费来满足非物质需求 如 消费人情 权力等 当今世界 消费 是一种需要 而会消费 是一种艺术 但无论怎样 有一种 物品 是绝对经
  • xctf攻防世界 MISC高手进阶区 low

    1 进入环境 下载附件 给出的一张bmp图片 没有其他信息 2 问题分析 扔进binwalk中 没有发现有用信息 使用zsteg 没有有用信息 塞入StegSolve中 发现有点猫腻 如图 有点二维码的感觉 emmm 需要像素处理 但不知道
  • css 获取当前类的子类,删除子类列表项的CSS类属性

    我一直试图在Html中创建一个无序列表 css类将附加 ul 元素及其子元素 li 元素 问题是如果另一个 无序列表 成为这个父无序列表的子元素 删除子类列表项的CSS类属性 我创建了下面的示例 以显示我的问题 的Javascript fu
  • 超详解“二分法查找”,一看就会!

    目录 一 二分法概念用途 二 超详思维图解 三 超详使用方法实现代码运行操作 四 总结 五 结语 一 二分法概念用途 什么是二分法 有什么作用 一般用在何处 概念 二分查找法算法 也叫折半查找算法 对半处理会提高寻找目标数字的效率 作用 在