目录

零、前言

一、算法思想

二、实现思路

四、源码


零、前言

今天我学习了二分查找(折半查找法),它是用于在有序集合中查找某一元素的便捷算法;算法思想易于理解,很多同学看了就觉得自己会了,但是约易于理解的东西越难掌握好,灵活运用更是难上加难。

我先举一个例子,如果我需要在1000万的数据中找出特定的某一个数,并且要求是O(n)的时间复杂度,这个时候你会怎么做呢?习惯暴力解法的同学,是不是只会依次遍历了?那这个时候肯定就超时啦!

算法的魅力在于解决生活当中的问题,而一个好的算法却能使大家受益其中。

一、算法思想

二分查找是一种非常简单易懂的快速查找算法,生活中到处可见。比如说,我们现在来做一
个猜字游戏。我随机写一个 0 到 99 之间的数字,然后你来猜我写的是什么。猜的过程中,
你每猜一次,我就会告诉你猜的大了还是小了,直到猜中为止。你来想想,如何快速猜中我
写的数字呢?
假设我写的数字是 23,你可以按照下面的步骤来试一试。(如果猜测范围的数字有偶数
个,中间数有两个,就选择较小的那个。)

7 次就猜出来了,是不是很快?这个例子用的就是二分思想,按照这个思想,即便我让你猜
的是 0 到 999 的数字,最多也只要 10 次就能猜中。

回到我们实际的开发环境,如果我们要从1000条数据中找到等于20元的订单;且已经排序完毕了,最简便的方法就是依次遍历,找不到就返回NULL;但这样太慢了,最差的情况是遍历完这1000条数据后才能找到我们需要的数据。

那到这里我们是否可以用二分的思想解决呢?

还是利用二分思想,每次都与区间的中间数据比对大小,缩小查找区间的范围。为了更加直
观,我画了一张查找过程的图。其中,low 和 high 表示待查找区间的下标,mid 表示待查
找区间的中间元素下标。

看懂这两个例子,你现在对二分的思想应该掌握得妥妥的了。我这里稍微总结升华一下,
分查找针对的是一个有序的数据集合,查找思想有点类似分治思想。每次都通过跟区间的中
间元素对比,将待查找的区间缩小为之前的一半,直到找到要查找的元素,或者区间被缩小
为 0。

二、实现思路

  1. 1. 将要查找的区间的起始位置、结束位置以及其中间位置分别记录下来。
  2. 2. 拿要查找的值与区间中间位置的元素做比较,若相等则返回该位置;否则分两种情况讨论:
  3. a. 若要查找的值比中间位置元素小,则缩小查找范围至左侧区间;
  4. b. 若要查找的值比中间位置元素大,则缩小查找范围至右侧区间。
  5. 3. 在新的区间中寻找中间位置,重复第二步,直到找到该元素为止。

具体步骤如下:

  1. 1. 定义left=0, right=n-1表示要查找的区间的起始位置和结束位置。
  2. 2. 只要left<=right,就表示区间还没有缩小到只剩一个元素,就可以继续查找,否则就表示要查找的元素不存在于数组中。
  3. 3. 计算中间位置mid = (left + right) /2。
  4. 4. 如果arr[mid]等于要查找的元素,返回mid;否则如果arr[mid]<要查找的元素,则将要查找的范围调整为mid+1~right,继续执行步骤3。否则将要查找的范围调整为left~mid-1,继续执行步骤3。
  5. 5. 重复上述过程,直到找到要查找的元素或确定要查找的元素不存在于数组中。
  6. 二分查找时间复杂度为O(log n),是一种高效的查找算法。但需要注意的是,该算法只能针对已排序的数组进行查找,因此如果数组未排序,则需要先进行排序操作。

四、源码

#include <stdio.h>int binary_search(int arr[], int low, int high, int target, int *index) {while (low <= high) {int mid = low + (high - low) / 2;if (arr[mid] == target) {*index = mid; // 将找到的目标值的下标通过指针返回return 1; // 返回 1 表示找到了目标值} else if (arr[mid] < target) {low = mid + 1;} else {high = mid - 1;}}return 0; // 返回 0 表示没找到目标值
}int main() {int arr[] = {1, 3, 5, 7, 9};int n = sizeof(arr) / sizeof(arr[0]);int target = 1;int index = -1; // 初始化 index 为 -1,表示没找到目标值if (binary_search(arr, 0, n - 1, target, &index)) { // 如果找到了目标值printf("%d 在数组中的下标是 %d\n", target, index);} else { // 没找到目标值printf("没有找到 %d\n", target);}return 0;
}

快乐学算法or二分查找深度刨析相关推荐

  1. 快乐学算法之:三分查找树ternary search tree

    文章目录 简介 三分查找树的结构 三分查找树的代码表示 三分查找树的应用 简介 之前我们介绍了tire字典树,tire字典树的优点就是插入和查找比较快速,但是它的缺点就是占用的空间比较大.假如我们要存 ...

  2. 算法图解/二分查找/简单查找/选择排序/递归算法/快速排序算法/

    大 O 表示法 大 O 表示法在讨论运行时间时,log 指的都是 log2 大 O 表示法指出了算法有多快,让你能够比较操作数,它指出了算法运行时间的增速,而并非以秒为单位的速度. 大 O 表示法指出 ...

  3. 数据结构与算法:二分查找

    二分查找是搜索算法中的一种,用来搜索有序数组 二分查找: 是一种简单算法,其输入是一个有序的元素列表(必须有序的原因稍后解释).如果要 查找的元素包含在列表中,二分查找返回其位置:否则返回null. ...

  4. java二分查找法_java算法之二分查找法的实例详解

    java算法之二分查找法的实例详解 原理 假定查找范围为一个有序数组(如升序排列),要从中查找某一元素,如果该元素在此数组中,则返回其索引,否则返回-1.通过数组长度可取出中间位置元素的索引,将其值与 ...

  5. 算法简介——二分查找,时间复杂度,空间复杂度

    文章目录 前言 二分查找 时间复杂度 大O表示法 空间复杂度 小结 前言 算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略 ...

  6. javascript数据结构与算法---检索算法(二分查找法、计算重复次数)

    javascript数据结构与算法---检索算法(二分查找法.计算重复次数) /*只需要查找元素是否存在数组,可以先将数组排序,再使用二分查找法*/ function qSort(arr){if (a ...

  7. 查找算法:二分查找、顺序查找

    08年9月入学,12年7月毕业,结束了我在软件学院愉快丰富的大学生活.此系列是对四年专业课程学习的回顾,索引参见:http://blog.csdn.net/xiaowei_cqu/article/de ...

  8. list 查找_趣味图解算法之二分查找

    大多数程序员在看到"算法"两字的时候,是不是头大如斗.但如果想去大公司发展,在面试时又绕不过算法这座大山.市面上好多讲解算法的书籍(如算法导论)基本上都太学术.太复杂,对初学者很不 ...

  9. 算法总结-二分查找算法

    二分查找也称折半查找(Binary Search),是一种效率较高的查找方法.该算法要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列.如果一个序列是无序的或者是链表,那么该序列就不能使用二 ...

最新文章

  1. 计算机笔试图形推理题,【笔记】教资笔试丨4分钟掌握信息处理以及逻辑判断!...
  2. SAP MMBE库存数量与在库序列号数量差异之处理
  3. 传感器应用的demo自动录音器
  4. 电源芯片选择DC/DC还是LDO?《转》
  5. mysql5.7.17 win7_win7下mysql5.7.17安装配置方法图文教程
  6. 电子围栏原理解析---原理
  7. 除冰机行业调研报告 - 市场现状分析与发展前景预测(2021-2027年)
  8. MATLAB-梯度Roberts算子、拉普拉斯算子、Sobel算子、Prewitt算子对图像进行锐化
  9. 目标检测中的非极大值抑制(NMS)
  10. 鱼塘钓鱼(fishing)
  11. HDU 6070 Dirt Ratio
  12. linux 路由配置工具下载,Linux/Openwrt路由安装配置UPNP服务提高迅雷下载速度
  13. 171025_matlab_imag函数
  14. S100数字源表之LDO芯片电学特性测试方案
  15. c语言程序设计工作任务,C语言程序设计任务驱动教程
  16. webpy模版中写JS代码的陷阱
  17. 新浪微博营销的方式与技巧都有哪些呢?
  18. 小清新版js扫雷(使用原生js)
  19. 将PPT导出图片分辨率提高的方法
  20. 敏捷的三个中心;再谈Buffer

热门文章

  1. httpie实用指南
  2. 盛迈坤电商:直通车的优化操作技巧
  3. 【Leetcode】2472. Maximum Number of Non-overlapping Palindrome Substrings
  4. FB潜在顾客表单找不到怎么回事?
  5. NBA名人堂之-威斯·昂塞尔|卡里姆·阿卜杜勒·贾巴尔|奈特·瑟蒙德|保罗·阿里金|埃尔金·贝勒
  6. 优麒麟Kyrin Ubuntu20.04使用tar解压的方法安装mysql5.7.23超详细
  7. 利用对于kaggle商品图片的分类
  8. sqrt在C语言中是啥意思,C语言 sqrt 是什么意思?_后端开发
  9. Java知识体系最强总结(2020版)
  10. React项目搭建及环境配置