二分查找又叫折半查找,要查找的前提是检索结果位于已排序的列表中。

概念

在一个已排序的数组seq中,使用二分查找v,假如这个数组的范围是[low...high],我们要的v就在这个范围里。查找的方法是拿low到high的正中间的值,我们假设是m,来跟v相比,如果m>v,说明我们要查找的v在前数组seq的前半部,否则就在后半部。无论是在前半部还是后半部,将那部分再次折半查找,重复这个过程,知道查找到v值所在的地方。

实现二分查找可以用循环,也可以递归,先给出两种方式的伪代码。

伪代码

使用循环实现

Iterative-Binary-Search(seq, v, low, high)
while low <= high
mid = (low + high) / 2
if v == seq[mid]
return mid
elseif v > seq[mid]
low = mid + 1
else
high = mid - 1
return NIL

使用递归实现

Recursive-Binary-Search(seq, v, low, high)
if low > high
return NIL
mid = (low + high) / 2
if v == seq[mid]
return mid
elseif v > seq[mid]
return Recursive-Binary-Search(seq,v,mid+1,high)
else
return Recursive-Binary-Search(seq,v,low,mid-1)

无论是循环还是递归,当数组为空的时候就结束(low > high),返回空值。当查找到v值的时候,也立即结束。

Python版

使用循环实现

def search(seq, v, low, high):
while low <= high:
mid = (low + high) // 2
if v == seq[mid]:
return mid
elif v > seq[mid]:
low = mid + 1
else:
high = mid - 1
return None

使用递归实现

def search2(seq, v, low , high):
if low > high:
return None
mid = (low + high) // 2
if v == seq[mid]:
return mid
elif v > seq[mid]:
return search2(seq, v, mid + 1, high)
else:
return search2(seq, v, low, mid - 1)

Python版源码:Github-Syler-Fun-Search-Python

Java版

使用循环实现

	public static int search(int[] seq, int v, int low, int high) {
while (low <= high) {
int mid = (low + high) / 2;
if (v == seq[mid]) {
return mid;
} else if (v > seq[mid]) {
low = mid + 1;
} else {
high = mid - 1;
}
} return Integer.MIN_VALUE;
}

使用递归实现

	public static int search2(int[] seq, int v, int low, int high) {
if (low > high) {
return Integer.MIN_VALUE;
}
int mid = (low + high) / 2;
if (v == seq[mid]) {
return mid;
} else if (v > seq[mid]) {
return search2(seq, v, mid + 1, high);
} else {
return search2(seq, v, low, mid - 1);
}
}

Java版源码:Github-Syler-Fun-Search-Java

但是实际上呢,Java版应该写成这个样子

Arrays.binarySearch(int[] a, int fromIndex, int toIndex, int key)

Java源码中的二分查找是这个样子的:

	public static int binarySearch(int[] a, int fromIndex, int toIndex,
int key) {
rangeCheck(a.length, fromIndex, toIndex);
return binarySearch0(a, fromIndex, toIndex, key);
} // Like public version, but without range checks.
private static int binarySearch0(int[] a, int fromIndex, int toIndex,
int key) {
int low = fromIndex;
int high = toIndex - 1; while (low <= high) {
int mid = (low + high) >>> 1;
int midVal = a[mid]; if (midVal < key)
low = mid + 1;
else if (midVal > key)
high = mid - 1;
else
return mid; // key found
}
return -(low + 1); // key not found.
}

所以呢,Java里就不用写二分查找算法,用自带的吧。

二分查找(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 704. 二分查找(Binary Search)

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

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

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

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

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

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

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

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

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

  8. 二分法查找(Binary Search)

    --摘要:二分法的介绍已经很多了,但并不直观,因此此文诞生,希望批评指正. 二分查找是在有序数组中查找一个元素的算法,通过比较目标元素与数组中间元素来查找,如果目标值是中间元素则将返回中间元素位置. ...

  9. 数组查找算法的C语言 实现-----线性查找和二分查找

    线性查找  Linear Search 用户输入学生学号的成绩 二分查找  Binary Search 要求数据表是已经排好序的 程序存在小的瑕疵

随机推荐

  1. 【Java基础】Java类的加载和对象创建流程的详细分析

    相信我们在面试Java的时候总会有一些公司要做笔试题目的,而Java类的加载和对象创建流程的知识点也是常见的题目之一.接下来通过实例详细的分析一下. 实例问题 实例代码 Parent类 package ...

  2. 揭秘Kafka高性能架构之道 - Kafka设计解析(六)

    原创文章,同步首发自作者个人博客.转载请务必在文章开头处以超链接形式注明出处http://www.jasongj.com/kafka/high_throughput/ 摘要 上一篇文章<Kafk ...

  3. 跨语言时区处理与Epoch

    国际化通用程序或标准协议通常都涉及到时区问题,比如最近项目用到的OIDC(OpenID Connect). OIDC基于OAuth2协议,其id_token中包含了exp来表达该Token的过期时间, ...

  4. C语言的一些基础

    一.C语言基础: 1.1.main函数是入口函数,用于进行link. 1.2..sln是解决方案的管理文件. 1.3.int:32位.short:16位.long:32位.long long:64位. ...

  5. 转 JSON与XML转换

    这两天处理模块的联调工作,在json与XML转换中出现了一些奇怪的问题,仔细究来,实为对org.json.*包知之太少.晚上baidu.google一下,找出了问题出现的原因.在模块中,使用了两个方法 ...

  6. React学习(一)父子组件通讯

    React父子组件之间通讯,利用props和state完成,首先React是单向数据流,父组件可以向子组件传递props: 实现父子组件双向数据流整体的思路是: 1,父组件可以向子组件传递props, ...

  7. Scrollview中嵌套ListView(自定义组件解决)

    首先,ScrollView中只能放一个控件,一般都放LinearLayout,orientation属性值为vertical.在LinearLayout中放需要呈现的内容.ListView也在其中,L ...

  8. JS第二弹:用Jquery组装html标签,输出到页面

    用Ajax从服务端获取数据,遍历到表格中(其实将表格替换了),中间发现不能为新增的元素绑定事件,原来是没有将其作为JQ对象

  9. HTML基础知识入门

    好的,我们开始吧,打开Eclipse,新建一个项目,就叫做Base吧,基础班的意思.注意哦,要建一个JavaWeb项目.右键,new,Dynamic Web Project,如果出来的菜单项没有,就点 ...

  10. POJ1019-Number Sequence数学

    题目链接:http://poj.org/problem?id=1019 题目大意: 题目的意思很清楚了,就是把数字的每一位都当成是单个的字母来对待,然后求第i位的数是哪一个.(1<=i<= ...