二分查找(Binary Search)

该文章的最新版本已迁移至个人博客【比特飞】,单击链接 https://www.byteflying.com/archives/699 访问。

二分查找也称折半查找,它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。 首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。


示例: 

public class Program {public static void Main(string[] args) {int[] array = { 8, 11, 21, 28, 32, 43, 48, 56, 69, 72, 80, 94 };Console.WriteLine(BinarySearch(array, 80));Console.WriteLine(BinarySearch(array, 66, 0, array.Length - 1));Console.ReadKey();}private static int BinarySearch(int[] array, int key) {//直接求解var min = 0;var max = array.Length - 1;var mid = 0;while (min <= max) {mid = (min + max) >> 1;if (array[mid] > key) {max = mid - 1;}else if (array[mid] < key) {min = mid + 1;}else if (array[mid] == key) {return mid;}  }return -1;}private static int BinarySearch(int[] array, int key, int low, int high) {//递归法if (low > high) return -1;var mid = (low + high) >> 1;if (array[mid] > key)return BinarySearch(array, key, low, mid - 1);else if (array[mid] < key)return BinarySearch(array, key, mid + 1, high);elsereturn mid;}}

请注意以上递归实现为尾递归,详情参考我的另一篇博文:

C#开发笔记之06-为什么要尽可能的使用尾递归,编译器会为它做优化吗?

以上是二分查找算法的2种实现,以下是这个案例的输出结果

该文章的最新版本已迁移至个人博客【比特飞】,单击链接 https://www.byteflying.com/archives/699 访问。:

10
-1

分析:

在最坏的情况下,二分查找需要在最后一次才能查找到目标关键字,假设原问题规模为n,每次折半原问题,设在第k次时问题规模变为1,那么令  ,因为指数和对数互为逆运算,解得  ,即二分查找在最坏的情况下的时间复杂度为: 

C#算法设计查找篇之02-二分查找相关推荐

  1. C#算法设计排序篇之04-选择排序(附带动画演示程序)

    选择排序(Selection Sort) 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/681 访问. 选择排序是一种简 ...

  2. 算法导论第2章(3) 二分查找 binary search

    二分查找(分治法). 二分查找也是一种分治法的实现,每一次查找将数据分为两个部分,问题规模都减小一半.这样查找的时间复杂度为logN.因为其实查找过程建立了一棵有N个节点的二叉树,查找次数是这棵树的高 ...

  3. C#算法设计查找篇之03-插值查找

    插值查找(Interpolation Search) 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/701 访问. 插值 ...

  4. 笔试算法题(58):二分查找树性能分析(Binary Search Tree Performance Analysis)

    议题:二分查找树性能分析(Binary Search Tree Performance Analysis) 分析: 二叉搜索树(Binary Search Tree,BST)是一颗典型的二叉树,同时任 ...

  5. 算法图解学习笔记01:二分查找大O表示法

    二分查找 二分查找又称折半查找,其输入的必须是有序的元素列表.二分查找的基本思想是将n个元素分成大致相等的两部分,取a[n/2]与x做比较,如果x=a[n/2],则找到x,算法中止:如果x<a[ ...

  6. python二分查找算法_如何使用python的二分查找算法

    如何使用python的二分查找算法 发布时间:2020-11-18 09:27:29

  7. 算法学习:我终于明白二分查找的时间复杂度为什么是O(logn)了

    最近发现了个好东西,就是一个学算法的好东西,是网易公开课的一个视频. 直通车 这是麻省理工学院的公开课,有中英字幕,感谢网易.. 也可以在App把视频缓存下来之后再放到电脑上面看,因为我这样可以倍速, ...

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

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

  9. 【算法设计与分析】02 货郎问题与计算复杂性理论

    什么是NP系列问题?今天来看看这些问题. 文章目录 1 货郎问题 2 0-1背包问题 3 什么是NP-hard问题(NP难问题) 1 货郎问题 问题:有n个城市,已知任何两个城市之间的距离,求一条每个 ...

最新文章

  1. dsp-asic-fpga
  2. WebSocket部署服务器外网无法连接解决方案
  3. 使用sqlmap直连数据库获取webshell
  4. java实例变量成员变量_Java的类成员变量、实例变量、类变量,成员方法、实例方法、类方法...
  5. JavaScript 计时器
  6. 微信小程序setinterval_简单谈谈setTimeout与setInterval
  7. 巫师3狂猎游戏风景Mac动态壁纸
  8. oracle怎么切换归档模式,Oracle学习系列—归档模式的切换
  9. 数据科学的原理与技巧 二、数据生成
  10. 来自天国的 kubernetes
  11. linux进程号转换成16进制,linux-shell 脚本转换 十六进制 十进制 八进制 二进制
  12. 有限元分析简单实例之四杆结构(matlab)
  13. Android,java敏感词,QQ,微信自动过滤组件
  14. andriod 连接数据库(MySQL)
  15. python根据四点坐标截取图片
  16. win10实现debug
  17. Python xlwings Excel单元格部分内容添加下划线
  18. img图片加载失败时,展示默认图片的方法
  19. 软体艺术系列--抽象工厂 (原文最终修订于2006年10月18日 凌晨04:25:06)
  20. PNAS | 香港理工李向东等揭示全球空气细菌群落与地球微生物组和人类活动的互作...

热门文章

  1. LeetCode 461. Hamming Distance
  2. 【AI视野·今日CV 计算机视觉论文速览 第187期 part2】Fri, 18 Dec 2020
  3. JVM—垃圾回收GC算法
  4. 数组的操作与方法的操作 0303 2101
  5. table表格 html 1128
  6. sqlserver增删改格式整理 1123
  7. HTML5新增标签 0303
  8. django-orm补课-使用shell-新增一行-再增一行-查找行-修改行
  9. python-教学管理系统-开发流程 草稿
  10. laravel-admin form中的数据,在提交后,保存前,获取并进行编辑