Binary search~~

  • 可曾听闻二分查找?
    • 引子
    • 细说二分查找
    • 总结:

可曾听闻二分查找?

引子

这里讲个我初中数学老师讲给我听的小故事,好久之前,湾湾做个一个综艺节目,上面有个挑战就是让参赛选手猜一个在一到一百之内的数字,你每猜一个数字,人家就会告诉你你猜大了还是小了,猜的次数越少,你获得的奖金也就越高。结果那个参赛选手很机灵啊,上来就猜五十,接着二十五,然后十二。
我觉得吧,就算让兄弟们上场多半也是会这样子,我相信兄弟们都是有慧根的人,其实如果我问你是怎么想到这样子做的,你多半是答不上来的,所以说思维是一种很奇妙的东西,你在不知不觉之中就运用到了一定的思维,就像我在刚开始学冒泡排序的时候,我根本不知道什么是算法,直到后来有人跟我讲解了一下算法的意思我才恍然大悟。
好,我有点扯远了,今天我们的重点就是向家人们介绍二分查找

细说二分查找

我关于二分查找的讲解就是基于我刚才讲的这个综艺,我们今天也上一把综艺,也搞一把!
首先我先敲一下黑板,记住记住,二分查找只适用于有序数列,升序降序我们不管,严格升序还是不严格降序我们也不管,但是我们要牢记有序二字,等到后面我i们开始刷题目的时候就会发现,一看到有序基本上就是这里的二分查找!
那我们首先先创建一个有序数组,这种时候我们就不用太老实了,一个个scanf输入这还了得啊?要知道赋值一样可以达到我们要的效果!

 int arr[100] = {0};for (int i = 0;i < 100;i++){arr[i] = i + 1;}

emmm,这个时候数组已经创建好了,我们是不是要生成一个随机数,然后让我猜数字啊,由于这篇博客我们的重点就是讲解二分查找,所以阿涛在这里就不再过多的给你们开小灶了,我试试能不能在下一篇博客里面好好地给大家讲解一下创建随机数的那些事儿!这里我们就意思一下,选个十一吧,因为阿涛记得一个女生的网名就是十一,嘿嘿!!`

         int n = 0;int k = 11;scanf("%d", &n);

那现在我们来稍微盘一下逻辑哈,无非就是三种情况,大了,小了,中了!!如果中间的数字大于答案,说明答案在左边,如果中间的数字小于答案,说明答案在后边,如果中间的数字正正好是答案,那就皆大欢喜!

 if (mid > k){printf("猜大了\n");}if (mid < k){printf("猜小了\n");}else{printf("蒙对了\n");

那我们稍微思考一下,我们不可能有这么好的运气吧,一次就能够猜中,所以十分显然其中必然会有循环的存在。
那么现在我们就来模拟一下,输入50,程序告诉你猜大了,说明什么?答案在你的左边,也就说明连同五十在内右边的数字都不可能是答案了对不对?这种时候,谁再猜大于等于50的数字那不是和钱过不去吗?那接下来,很显然我们还是要接着进行二分查找,但是后边的范围就变了,将不再是100,而是49了,同理猜小了也是一个道理!不难写出下面代码的雏形:

while (){scanf("%d",&n);if (mid > k){printf("猜大了\n");right = n - 1;}else if (mid < k){printf("猜小了\n");left = n + 1;}else{printf("蒙对了\n");}}

刚才在敲代码的时候我还发现了一个小错误,在第二种情况的时候我少加了一个else,加不加将会是天差地别,这点我在之前一篇博客里面提到了,有兴趣的小伙伴可以去看一看!!
那么接下来我们还要解决的问题就是mid,right,left,循环条件都是什么!
刚开始的时候很显然,left就是第一个数字的下标,也就是零,而right是可以通过sizeof/sizeof来求出来的(兄弟们想啊,总共的内存大小除以一个元素的内存大小可不就是数组元素的个数吗),解决了left,right,mid不是手到擒来的小事吗?(L+R)/2就成!

 int left = 0;int sz = sizeof(arr) / sizeof(arr[0]);int right = sz - 1;int mid = (right + left) / 2;while (){scanf("%d",&n);mid = (right + left) / 2;if (arr[n-1] > k){printf("猜大了\n");right = n - 1;}else if (arr[n-1] < k){printf("猜小了\n");left = n + 1;}else{printf("蒙对了\n");}}

各位客官老爷听完了我的讲解,再看这串代码有没有一种豁然开朗的感觉?
当然了,上面的代码还比较落后需要通过各位客官老爷手动输入数字,还要计算中间值,忒麻烦了。我,我们是谁,我们可是不可一世的程序员,这点小事情还需要自己动手?开什么玩笑!

 while (){mid = (right + left) / 2;if (arr[mid] > k){right = mid- 1;}else if (arr[mid] < k){left = mid + 1;}else{printf("答案为%d", arr[mid]);break;}}

现在就只差一个循环条件了,我们可以想象到,左边在一直往右边增大,右边一直往左边减小,如果一直找不到我们想要的数字,那么总有一天左边会跑到右边,待这一段明知道不会有结果的关系,我们是不是应该及时止损,是不是应该急流勇退,然后开始我们新的生活?我们就应该潇洒地转身,然后留给过去一个帅气的背影,就应该及时退出循环,最好再打上一行字,告别过去!那么循环条件就是呼之欲出了,左边不能够大于后边!!!今天我刚好高兴,我还可以统计一下 总共循环了多少次!

int main()
{int k = 11;int arr[100] = {0};for (int i = 0;i < 100;i++){arr[i] = i + 1;}int left = 0;int sz = sizeof(arr) / sizeof(arr[0]);int right = sz - 1;int mid = (right + left) / 2;int count = 0;while (left<=right){count++;mid = (right + left) / 2;if (arr[mid] > k){right = mid- 1;}else if (arr[mid] < k){left = mid + 1;}else{printf("找到了,答案为%d\n", arr[mid]);break;}}if (left > right){printf("找不到你输入的数\n");}else{printf("count=%d", count);}return 0;
}

下面再给兄弟们看一下找不到的情况:

总结:

二分查找多运用于有序数列,二分查找也叫做折半查找,通过名字就很容易理解,重点要设置好循环的条件,中间还有一个设置随机数以及sizeof的运用,我先空着,接下来有时间一定给兄弟们补上!!!

希望我的这篇博客能够给予到兄弟们一些帮助!
百年大道,你我共勉!!!!

关于二分查找那些事儿~~~~看完至少节省你两个半月的时间!!!!!相关推荐

  1. 二分查找理论(三种问题类型、两种算法形式)

    从这篇文章开始,我将开启算法专栏,记录在刀砍leetcode算法过程中的理论总结与实战代码,我认为二分算法是算法问题中细节最多的部分,所以我先拿它开刀!二分题目实战请看我的二分查找专栏:二分查找实战专 ...

  2. 《Java后端性能调优实战方案手册》,看完至少阿里P7

    之前有朋友说,"我们公司的系统从来都没有经过性能调优,集成测试没问题后就上线了,上线后也几乎没出现过性能问题."其实没遇到性能问题不代表程序不存在性能问题,只能说明系统的访问量有点 ...

  3. 看完书要及时消化(1)《暗时间》

    前提:     我们有一个被广泛认可的记忆机制,即:我们在记忆的时候将许多线索(例如当时的场景,问题的背景,甚至所处的语言环境,空间位置)一并编码进了记忆,事后能否提取出这段记忆严重取决于提取线索是否 ...

  4. xtragrid 某个值 查找_二分查找(下):如何快速定位IP对应的省份地址?

    通过IP地址来查找IP归属地的功能,不知道你有没有用过?没用过也没关系,你现在可以打开百度,在搜索框里随便输一个IP地址,就会看到它的归属地. 这个功能并不复杂,它是通过维护一个很大的IP地址库来实现 ...

  5. leetcode 436. Find Right Interval | 436. 寻找右区间(二分查找不小于某值的第一个位置)

    题目 https://leetcode.com/problems/find-right-interval/ 题解 这题考察点不难,就是个普通的二分查找.详细过程是: 因为 start 是唯一的,所以先 ...

  6. C#LeetCode刷题-二分查找​​​​​​​

    二分查找篇 # 题名 刷题 通过率 难度 4 两个排序数组的中位数 C#LeetCode刷题之#4-两个排序数组的中位数(Median of Two Sorted Arrays)-该题未达最优解 30 ...

  7. 无序链表(顺序查找)和有序数组(二分查找)-基础实现-符号表(二)-数据结构和算法(Java)

    文章目录 1 无序链表的顺序查找 1.1 无序链表实现 1.2 分析 2 有序数组中的二分查找 2.1 实现 2.2 分析 3 对二分查找的分析 4 总结 5 后记 1 无序链表的顺序查找 1.1 无 ...

  8. problem k: 查找某一个数_quot;细节魔鬼quot; 二分查找

    ❝ 二分查找,是一个高效,实用,且易理解的一个查找算法, 通常时间复杂度为O(lgn).局限性在于,待查找对象必须为有序的数组:数据量过小,优势不明显,数据量过大,数组大小受限于内存. 除此之外,二分 ...

  9. 小白的算法初识课堂(part1)--二分查找法

    学习笔记 学习书目:<算法图解>- Aditya Bhargava 二分查找法 算法是一组完成任务的指令,任何代码片段都可视为算法.二分查找是一种算法,其输入是一个有序的元素列表(必须有序 ...

  10. LeetCode的二分查找的练习部分总结

    这两天由于工作的原因,一直没有写博客,但是却把LeetCode上面的题目做了不少--二分查找.上面这些题都是这两天写的.现在简单做一个总结. 首先二分查找的思想就是对一个有规律的元素(事情)进行不断的 ...

最新文章

  1. 进击的java(2)
  2. Spark性能优化:对RDD持久化或CheckPoint操作
  3. Win谷歌插件加载失效
  4. 说一下StoreBoard和纯代码编程各有什么好处吧
  5. 详解 | 引起电源模块发热的4个主要原因
  6. python easygui_Python里的easygui库
  7. android滚动条布局平分,让你的布局滚动起来—ScrollView
  8. 使用github+hexo搭建静态博客
  9. sql int 比较_SQL进阶--错题集1
  10. MySQL常用命令基础操作
  11. 北航论文模板:解决XeLaTeX中Font shape'TU/SimSun(1)/b/n' undefined(font) using 'TU/SimSun(1)/m/n' instead
  12. FFmpeg 解码 H264 格式的视频
  13. ORA-01950: 对表空间 USERS无权限
  14. CVPR2020(Enhancement):论文解读《Zero-Reference Deep Curve Estimation for Low-Light Image Enhancement》
  15. 中间商只会赚差价?论接口的重要性
  16. 【Java】设计一个动物声音“模拟器”,希望模拟器可以模拟许多动物的叫声。
  17. 解决 canvas隐藏后出现滚动条的问题
  18. Mac电脑Safari 浏览器中Cookie 和网站数据如何管理
  19. Explaining and Harnessing Adversarial Examples——论文的学习笔记01
  20. 第17节 PKI公钥基础设施

热门文章

  1. 输入一串字符串 字符串长度不超过100
  2. 好奇怪呀后面加什么标点_说后面加什么标点符号
  3. docker 安装redis并配置redis.conf
  4. 相关搜索 --- 搜索中的推荐
  5. Android高德地图点击大头针更换大头针图片
  6. 鸿蒙系统2.0的编译
  7. 上海提取公积金所需材料
  8. 第二部分 自动内存管理
  9. ept技术_[讨论]R3检测EPT方式HOOK页面的方案(20170919更新-已解决)
  10. “阴魂不散”的新冠:最新研究发现98种长期的新冠病毒后遗症