二分查找的非递归实现
2015-10-29 00:46
302 查看
之前阅读《代码之美》这本书时,作者提到很多程序员都觉得二分查找非常简单,但是却一时半会写不出二分查找算法,或是写得不好。后来听同学说参加面试时被要求手写二分查找,因此决定自己也要复习一下这些基础的算法。平时调用得多了,很多东西还真不见得能很快实现出来…
二分查找类似于生活中的翻书。比如一本书,页码已经是升序排好的。这个时候你要看第200页,随手一翻,发现是第100页,于是前面100页你就不用翻了,直接翻后面。这一翻,翻到了第300页,于是300页后面的你也不用翻了,继续在100~300页之间搜索第200页。随着翻的次数增多,搜索区间也就被逐步缩小,直到最后找到第200页为止。当然,也存在一种非常不幸的情况,就是有哪个熊孩子把第200页撕了,于是只好返回“404-找不到页面”。当然,计算机的二分查找算法和人类翻书之间还是有区别的。二分查找每次都会翻开待搜索部分的最中间一页,而人类翻书,会翻开第几页就相对随机了很多。
说完了原理,现在祭出代码。二分查找,时间复杂度O(logn),空间复杂度O(1),非递归实现代码如下:
二分查找类似于生活中的翻书。比如一本书,页码已经是升序排好的。这个时候你要看第200页,随手一翻,发现是第100页,于是前面100页你就不用翻了,直接翻后面。这一翻,翻到了第300页,于是300页后面的你也不用翻了,继续在100~300页之间搜索第200页。随着翻的次数增多,搜索区间也就被逐步缩小,直到最后找到第200页为止。当然,也存在一种非常不幸的情况,就是有哪个熊孩子把第200页撕了,于是只好返回“404-找不到页面”。当然,计算机的二分查找算法和人类翻书之间还是有区别的。二分查找每次都会翻开待搜索部分的最中间一页,而人类翻书,会翻开第几页就相对随机了很多。
说完了原理,现在祭出代码。二分查找,时间复杂度O(logn),空间复杂度O(1),非递归实现代码如下:
int BinarySearch(int x[], int n, int key) { int left = 0, right = n-1, mid; while (left <= right) { mid = (left + right) / 2; if (x[mid] == key) return mid; // 找到了,返回目标数的位置 if (x[mid] < key) left = mid + 1; // 选择右半段 else right = mid - 1; // 选择左半段 } return -1; // 很苦逼,没找到 }
相关文章推荐
- 动易2006序列号破解算法公布
- Ruby实现的矩阵连乘算法
- C#插入法排序算法实例分析
- Lua教程(七):数据结构详解
- 解析从源码分析常见的基于Array的数据结构动态扩容机制的详解
- 超大数据量存储常用数据库分表分库算法总结
- C#数据结构与算法揭秘二
- C#冒泡法排序算法实例分析
- C#数据结构揭秘一
- 算法练习之从String.indexOf的模拟实现开始
- C#算法之关于大牛生小牛的问题
- C#实现的算24点游戏算法实例分析
- c语言实现的带通配符匹配算法
- 数据结构之Treap详解
- 浅析STL中的常用算法
- C++二分查找在搜索引擎多文档求交的应用分析
- 算法之排列算法与组合算法详解
- C++实现一维向量旋转算法
- Ruby实现的合并排序算法
- C#折半插入排序算法实现方法