二分查找

定义

二分查找(Binary Search)又称折半查找,它是一种效率较高的查找方法。

要求

(1)必须采用顺序存储结构

(2)必须按关键字大小有序排列

查找思路

首先将给定值K,与表中中间位置元素的关键字比较,若相等,返回该元素的存储位置;若不等,这所需查找的元素只能在中间数据以外的前半部分或后半部分中。然后在缩小的范围中继续进行同样的查找。如此反复直到找到为止。

适用情况

该查找方法仅适合于线性表的顺序存储结构,不适合链式存储结构,且要求元素按关键字有序排列。

优缺点

虽然二分查找的效率高,但是要将表按关键字排序。而排序本身是一种很费时的运算。既使采用高效率的排序方法也要花费O(nlgn)的时间。二分查找只适用顺序存储结构。为保持表的有序性,在顺序结构里插入和删除都必须移动大量的结点。因此,二分查找特别适用于那种一经建立就很少改动、而又经常需要查找的线性表。

非递归实现代(还有一种用递归实现的二分查找)

Java代码如下(自己写的,有兴趣的可以查看Java源码):

import java.util.Arrays;

public class BinarySearch {

	public static void main(String[] args) {
// 测试代码
int[] arr = { 4, 58, 69, 54, 2, 48, 62, 78 }; // 对数组进行排序,以便使用二分查找(也称折半查找),并打印排序后的数组,
System.out.println(Arrays.toString(arr));
System.out.println(myBinarySearch(arr, 69));
} /**
* @param arr 操作数组
* @param target 查找目标
* @return 查找到,返回目标在数组中的索引,没找到返回-1
*/
public static int myBinarySearch(int[] arr, int target) {
int start = 0;// 开始查找的索引
int end = arr.length - 1;// 结束查找的索引 while (start <= end) {
int mid = (start + end) / 2; if (target == arr[mid]) {
return mid;
}
if (target > arr[mid]) {
start = mid + 1;
}
if (target < arr[mid]) {
end = mid - 1;
}
}
// 没找到返回-1
return -1;
}// myBinarySearch }

经典算法二分查找循环实现Java版的更多相关文章

  1. 二分查找法(java版)

    二分查找法也称为折半查找法,在有序的序列中使用二分法可以提高程序的执行效率. 典型的二分查找法代码 public int binarySearch1(int[] arr,int target){ in ...

  2. 剑指Offer——回溯算法解迷宫问题(java版)

    剑指Offer--回溯算法解迷宫问题(java版)   以一个M×N的长方阵表示迷宫,0和1分别表示迷宫中的通路和障碍.设计程序,对任意设定的迷宫,求出从入口到出口的所有通路.   下面我们来详细讲一 ...

  3. Java算法 -- 二分查找

    折半查找,要求待查找的序列有序.每次取中间位置的值与待查关键字比较,如果中间位置的值比待查关键字大,则在前半部分循环这个查找的过程,如果中间位置的值比待查关键字小,则在后半部分循环这个查找的过程.直到 ...

  4. Java-数据结构与算法-二分查找法

    1.二分查找法思路:不断缩小范围,直到low <= high 2.代码: package Test; import java.util.Arrays; public class BinarySe ...

  5. 南理第八届校赛同步赛-F sequence//贪心算法&二分查找优化

    题目大意:求一个序列中不严格单调递增的子序列的最小数目(子序列之间没有交叉). 这题证明贪心法可行的时候,可以发现和求最长递减子序列的长度是同一个方法,只是思考的角度不同,具体证明并不是很清楚,这里就 ...

  6. 二分查找的变种(Java实现)

    普通二分查找: 先回顾一下普通的二分查找 注意:二分查找有这样一个问题:当数组中数有重复时,比如 {3,3,3,3} 这个数组,二分查找3时,返回的是arr[1],也就是说二分查找并不会返回3第一次出 ...

  7. 二分查找BinarySearch(Java)

    二分查找(折半查找)BinarySearch 二分查找  一组排好顺序的数,查找其中的一个数(value)的位置,按照数组(int[] a)存放这组数据,数组的索引所指的位置就是需要查找的数,用三个变 ...

  8. 莫队算法/二分查找 FZU 2072 Count

    题目传送门 题意:问区间内x的出现的次数分析:莫队算法:用一个cnt记录x的次数就可以了.还有二分查找的方法 代码: #include <cstdio> #include <algo ...

  9. #C++初学记录(贪心算法#二分查找)

    D - Aggressive cows 农夫 John 建造了一座很长的畜栏,它包括N (2 <= N <= 100,000)个隔间,这些小隔间依次编号为x1,...,xN (0 < ...

随机推荐

  1. nginx upstream的五种分配方式

    Nginx负载均衡选项upstream用法举例 1.轮询(weight=1) 默认选项,当weight不指定时,各服务器weight相同,每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器d ...

  2. Django框架(六)

    十一.Django组件-cookie与session 1.会话跟踪技术 (1) 什么是会话跟踪技术 我们需要先了解一下什么是会话!可以把会话理解为客户端与服务器之间的一次会晤,在一次会晤中可能会包含多 ...

  3. Python爬虫之requests

    爬虫之requests 库的基本用法 基本请求: requests库提供了http所有的基本请求方式.例如 r = requests.post("http://httpbin.org/pos ...

  4. UVa 11627 - Slalom 二分. oj错误题目 难度: 0

    题目 https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&a ...

  5. navicat连接Oracle数据库

    记录一下navicat连接Oracle数据库过程: 一.根据自己版本去Oracle官网下载instantclient 地址:https://www.oracle.com/technetwork/top ...

  6. LinuxTimeLine

  7. effective_java第23条:请不要新代码中使用原生态类型

    从这条开始涉及泛型相关的点. 从JDK5开始Java新增了“泛型”新特性,例如:List<String>,在这之前则只有List不会限定类型. 如今的JDK版本中还是可以写原生类型,但这会 ...

  8. 自动化测试-18.selenium之bugFree代码注释

    #encoding=utf-8 import xlrd,time,os from xlutils.copy import copy from selenium import webdriver def ...

  9. 使用ssh免密登录

    在开发中经常会遇到远程登录服务器,要经常输入密码.有时密码太复杂记不住,还需要保存到本地文件中. 可以使用ssh命令,配置密钥登录,这样就不需要输入密码,一劳永逸,何乐而不为 ^--^ 配置密钥只需要 ...

  10. 购物车存到cookie

    为什么不存session? 首先,session存在时间限制,会定期清空的,而cookie如果不主动清或者设置定期则不会清楚: session存放在服务器端,cookie存放在客户端浏览器. 购物车存 ...