--摘要:二分法的介绍已经很多了,但并不直观,因此此文诞生,希望批评指正。

二分查找是在有序数组中查找一个元素的算法,通过比较目标元素与数组中间元素来查找,如果目标值是中间元素则将返回中间元素位置。

如果目标元素较小,则继续查找小于中间元素部分,如果目标元素较大,则继续查找大于中间元素部分。直到查找成功并返回其位置,或查到失败返回。

例在 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)的更多相关文章

  1. STL之二分查找 (Binary search in STL)

    STL之二分查找 (Binary search in STL) Section I正确区分不同的查找算法count,find,binary_search,lower_bound,upper_bound ...

  2. 【转】STL之二分查找 (Binary search in STL)

    Section I正确区分不同的查找算法count,find,binary_search,lower_bound,upper_bound,equal_range 本文是对Effective STL第4 ...

  3. LeetCode编程训练 - 折半查找(Binary Search)

    Binary Search基础 应用于已排序的数据查找其中特定值,是折半查找最常的应用场景.相比线性查找(Linear Search),其时间复杂度减少到O(lgn).算法基本框架如下: //704. ...

  4. 算法与数据结构基础 - 折半查找(Binary Search)

    Binary Search基础 应用于已排序的数据查找其中特定值,是折半查找最常的应用场景.相比线性查找(Linear Search),其时间复杂度减少到O(lgn).算法基本框架如下: //704. ...

  5. LeetCode 704. 二分查找(Binary Search)

    704. 二分查找 704. Binary Search 题目描述 给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target,写一个函数搜索 nums 中的 target,如果 ...

  6. 二分查找(binary search)

    二分查找又叫折半查找,要查找的前提是检索结果位于已排序的列表中. 概念 在一个已排序的数组seq中,使用二分查找v,假如这个数组的范围是[low...high],我们要的v就在这个范围里.查找的方法是 ...

  7. 数据结构-二分查找(Binary Search)

    #include <stdio.h> #include <string.h> #include <stdlib.h> #define LIST_INIT_SIZE ...

  8. [Swift]LeetCode704. 二分查找 | Binary Search

    Given a sorted (in ascending order) integer array nums of nelements and a target value, write a func ...

  9. Leetcode之二分法专题-704. 二分查找(Binary Search)

    Leetcode之二分法专题-704. 二分查找(Binary Search) 给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target  ,写一个函数搜索 nums 中的 t ...

随机推荐

  1. careercup-递归和动态规划 9.10

    9.10 给你一堆n个箱子,箱子宽w,高h,深d.箱子不能翻转,将箱子堆起来时,下面箱子的宽度.高度和深度必须大于上面的箱子.实现一个方法,搭出最高的一堆箱子,箱堆的高度为每个箱子高度的总和. 解法: ...

  2. Socket解决粘包问题1

    粘包是指发送端发送的包速度过快,到接收端那边多包并成一个包的现象,比如发送端连续10次发送1个字符'a',因为发送的速度很快,接收端可能一次就收到了10个字符'aaaaaaaaaa',这就是接收端的粘 ...

  3. iOS之KVO和KVC

    概述 由于ObjC主要基于Smalltalk进行设计,因此它有很多类似于Ruby.Python的动态特性,例如动态类型.动态加载.动态绑定等.今天我们着重介绍ObjC中的键值编码(KVC).键值监听( ...

  4. 远程之SSH

    SSH(Secure Shell的缩写),由 IETF 的网络工作小组(Network Working Group)所制定:SSH 为建立在应用层和传输层基础上的安全协议.SSH 是目前较可靠,专为远 ...

  5. Spring MVC自定义统一异常处理类,并且在控制台中输出错误日志

    在使用SimpleMappingExceptionResolver实现统一异常处理后(参考Spring MVC的异常统一处理方法), 发现出现异常时,log4j无法在控制台输出错误日志.因此需要自定义 ...

  6. C#操控条形码扫描枪

    // 条码扫描器 // 窗体部分相关代码: using System; using System.Collections.Generic; using System.ComponentModel; u ...

  7. C# Mutex对象的使用

    C# Mutex对象的使用 C#语言有很多值得学习的地方,这里我们主要介绍C# Mutex对象,包括介绍控制好多个线程相互之间的联系等方面. 如何控制好多个线程相互之间的联系,不产生冲突和重复,这需要 ...

  8. nyoj832 合并游戏(状态压缩DP)

    题意 : n个石子, 给你一个n*n矩阵, A[i][j]表示第i个和第j个合并蹦出的金币值, 合并完石子 j 消失.求合并所有石子后,所得的最大金币数. 分析 :     1. 题中给的数据范围   ...

  9. ACM/ICPC ZOJ1003-Crashing Balloon 解题代码

    #include <iostream> using namespace std; int main() { int **array = new int *[100]; for ( int ...

  10. c语言中结构体的定义、初始化及内存分配

    #include <stdio.h> struct person { char *name; int age; }; int main() { //结构体可以定义在函数内,也可以定义到函数 ...