二分法查找(Binary Search)
--摘要:二分法的介绍已经很多了,但并不直观,因此此文诞生,希望批评指正。
二分查找是在有序数组中查找一个元素的算法,通过比较目标元素与数组中间元素来查找,如果目标值是中间元素则将返回中间元素位置。
如果目标元素较小,则继续查找小于中间元素部分,如果目标元素较大,则继续查找大于中间元素部分。直到查找成功并返回其位置,或查到失败返回。
例在 2,5,7,8,10,15,18,20,22,25,28中查找18,简要图示,下文有更详细分布图例:

C语言实现
函数原型:
int binary_search(int *array, int imin, int imax, int key)
/**
* return the index of key.
* return -1 when failed.
*/
int binary_search(int *array, int imin, int imax, int key)
{
int imid; if(array == NULL || imin > imax) {
return -;
} while(imin <= imax) {
imid = imin + (imax - imin) / ; //avoid integer overflow
if(array[imid] == key) {
return imid;
} else if(array[imid] > key) {
imax = imid - ;
} else {
imin = imid + ;
}
} return -;
}
需要注意:
中间元素的查找方法不能为imid = ( imin + imax ) / 2,这样可能会造成整数溢出,因此应改为imid = imin + (imax – imin) / 2。
整数溢出:两个大整数相加其结果超过寄存器能存储的最大值,结果不可知。
图解说明:
array: 2 5 7 8 10 15 18 20 22 25 28
length:11
key: 18
imax = length - 1 = 10
imin = 0
步骤1:
imid = ( imin + imax ) / 2 = (0 + 10) / 2 = 5

步骤2:
imid = ( imin + imax ) / 2 = (6 + 10) / 2 = 8 imax = imid -1 = 7

步骤3:
imid = ( imin + imax ) / 2 = (6 + 7) / 2 = 6 find 18: index is 6

原码下载地址:
https://github.com/zsirGitHub/algorithms
二分法查找(Binary Search)的更多相关文章
- STL之二分查找 (Binary search in STL)
STL之二分查找 (Binary search in STL) Section I正确区分不同的查找算法count,find,binary_search,lower_bound,upper_bound ...
- 【转】STL之二分查找 (Binary search in STL)
Section I正确区分不同的查找算法count,find,binary_search,lower_bound,upper_bound,equal_range 本文是对Effective STL第4 ...
- LeetCode编程训练 - 折半查找(Binary Search)
Binary Search基础 应用于已排序的数据查找其中特定值,是折半查找最常的应用场景.相比线性查找(Linear Search),其时间复杂度减少到O(lgn).算法基本框架如下: //704. ...
- 算法与数据结构基础 - 折半查找(Binary Search)
Binary Search基础 应用于已排序的数据查找其中特定值,是折半查找最常的应用场景.相比线性查找(Linear Search),其时间复杂度减少到O(lgn).算法基本框架如下: //704. ...
- LeetCode 704. 二分查找(Binary Search)
704. 二分查找 704. Binary Search 题目描述 给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target,写一个函数搜索 nums 中的 target,如果 ...
- 二分查找(binary search)
二分查找又叫折半查找,要查找的前提是检索结果位于已排序的列表中. 概念 在一个已排序的数组seq中,使用二分查找v,假如这个数组的范围是[low...high],我们要的v就在这个范围里.查找的方法是 ...
- 数据结构-二分查找(Binary Search)
#include <stdio.h> #include <string.h> #include <stdlib.h> #define LIST_INIT_SIZE ...
- [Swift]LeetCode704. 二分查找 | Binary Search
Given a sorted (in ascending order) integer array nums of nelements and a target value, write a func ...
- Leetcode之二分法专题-704. 二分查找(Binary Search)
Leetcode之二分法专题-704. 二分查找(Binary Search) 给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 t ...
随机推荐
- 【转】以XML文件方式保存用户数据——2013-08-25 22
正在做项目中有很多游戏数据要保存,常见的玩家数据这些比较简单的可以用CCUserDefault.它是cocos2d-x用来存取基本数据类型用的.保存为XML文件格式. 主要方法:(和java的map很 ...
- linux中的openoffice服务终止运行
现象: 最近的linux中的openoffice服务进程运行一段时间后会自动停止,刚开始还以为忘了启动执行自启动脚本导致的.在连续出现前述情况后,开始查找应用程序崩溃的原因,首先查看linux服务器的 ...
- StyleCop安装及配置
How to modify the default new class template for C# in Visual Studio 2008 or 2010? 可参考博客: http://www ...
- jquery - ul li click 无响应
搞了很久, 发现对应jquery来说, 动态产生的ul li(其实不只是这个, 还有 table td等), 直接使用 $("#ul_div>li").click(funct ...
- 使用Visual Studio发布应用安装包
安装包制作方式 使用Visual Studio进行应用的打包分发有两种方式: 1.使用Clickonce发布安装包: 2.使用Setup工程发布安装包. 操作步骤 Clickonce发布安装包 1.右 ...
- 在office 2010中插入Mathtype出现ctrl+v不能复制的问题
加载项中去掉command for那个即可 详细网址:http://heblue.blog.163.com/blog/static/96325568201375102628405/
- ios paper for facebook 使用第三方库
facebook paper使用的第三方库 Facebook Paper使用的第三方库 第三方库名 简介 链接 ACE code editor https://github.com/ajaxorg/a ...
- 使用CLK.AspNet.Identity提供以角色为基础的访问控制(RBAC)
使用CLK.AspNet.Identity提供以角色为基础的访问控制(RBAC) 程序代码下载 程序代码下载:点此下载 前言 ASP.NET Identity是微软所贡献的开源项目,用来提供ASP.N ...
- 10.21_Nutz批量插入顺序,POI,wiki持续关注,POI,SSH,数据库优先
(1)Nutz,dao的批量插入会关注顺序吗? http://www.douban.com/group/topic/64322582/ (2)工作需要优先!!! POI,SSH,数据库管理及plsq ...
- Codevs 3729 飞扬的小鸟
飞扬的小鸟 标签 动态规划 NOIp提高组 2014 难度 提高+/省选- 题目描述 Flappy Bird 是一款风靡一时的休闲手机游戏.玩家需要不断控制点击手机屏幕的频率来调节小鸟的飞行高度,让小 ...