package Search;

public class biSearch {
//标准的二分查找
public static int stdBiSearch(int[] array,int keyValue) {
int length=array.length;
int left=0,right=length-1;
while(left<=right){
int mid=(left+right)/2;
if(keyValue<array[mid]) right=mid-1;
else if(keyValue>array[mid]) left=mid+1;
else return mid;
}
return -1;
} //(二分法)查找第一个小于keyValue的元素
public static int BiSearchToFindFirstSmaller(int[] array,int keyValue) {
int length=array.length;
int left=0,right=length-1;
while(left<=right){
int mid=(left+right)/2;
if(keyValue<=array[mid]) right=mid-1;
else left=mid+1;
}
return right;
} //(二分法)查找第一个大于等于keyValue的元素
public static int BiSearchToFindFirstBiggerorEqual(int[] array,int keyValue) {
int length=array.length;
int left=0,right=length-1;
while(left<=right){
int mid=(left+right)/2;
if(keyValue<=array[mid]) right=mid-1;
else left=mid+1;
}
return left;
} //(二分法)查找第一个最后一个小于等于keyValue的元素
public static int BiSearchToFindLastSmallerorEqual(int[] array,int keyValue) {
int length=array.length;
int left=0,right=length-1;
while(left<=right){
int mid=(left+right)/2;
if(keyValue<array[mid]) right=mid-1;
else left=mid+1;
}
return right;
} //(二分法)查找第一个第一个大于keyValue的元素
public static int BiSearchToFindFirstBigger(int[] array,int keyValue) {
int length=array.length;
int left=0,right=length-1;
while(left<=right){
int mid=(left+right)/2;
if(keyValue<array[mid]) right=mid-1;
else left=mid+1;
}
return left;
} //(二分法)查找第一个第一个等于keyValue的元素
public static int BiSearchToFindFirst(int[] array,int keyValue) {
int length=array.length;
int left=0,right=length-1;
while(left<=right){
int mid=(left+right)/2;
if(keyValue<=array[mid]) right=mid-1;
else left=mid+1;
}
//array[right]<keyValue<=array[left]
if(left<length&&array[left]==keyValue) return left;
else return -1;
} //(二分法)查找第一个最后一个等于keyValue的元素
public static int BiSearchToFindLast(int[] array,int keyValue) {
int length=array.length;
int left=0,right=length-1;
while(left<=right){
int mid=(left+right)/2;
if(keyValue<array[mid]) right=mid-1;
else left=mid+1;
}
//array[right]<=keyValue<array[left]
if(right>=0&&array[right]==keyValue) return right;
else return -1;
} //测试样例
public static void main(String[] args) {
int[] a=new int[]{0,1,2,2,2,5,6};
System.out.println(BiSearchToFindLast(a, 2));
}
}

一张图帮助理解:

参考博客地址:https://www.cnblogs.com/bofengyu/p/6761389.html

SUMMARY | 二分查找的更多相关文章

  1. c#-二分查找-算法

    折半搜索,也称二分查找算法.二分搜索,是一种在有序数组中查找某一特定元素的搜索算法. A 搜素过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束: B 如果某一特定元素大于或者小 ...

  2. C#二分查找算法设计实现

    C#二分查找算法设计实现 1.介绍 二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法.但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列.(记住了 ...

  3. 最新IP地址数据库 二分逼近&二分查找 高效解析800万大数据之区域分布

    最新IP地址数据库  来自 qqzeng.com 利用二分逼近法(bisection method) ,每秒300多万, 比较高效! 原来的顺序查找算法 效率比较低 readonly string i ...

  4. jvascript 顺序查找和二分查找法

    第一种:顺序查找法 中心思想:和数组中的值逐个比对! /* * 参数说明: * array:传入数组 * findVal:传入需要查找的数 */ function Orderseach(array,f ...

  5. Java实现的二分查找算法

    二分查找又称折半查找,它是一种效率较高的查找方法. 折半查找的算法思想是将数列按有序化(递增或递减)排列,查找过程中采用跳跃式方式查找,即先以有序数列的中点位置为比较对象,如果要找的元素值小 于该中点 ...

  6. 从一个NOI题目再学习二分查找。

    二分法的基本思路是对一个有序序列(递增递减都可以)查找时,测试一个中间下标处的值,若值比期待值小,则在更大的一侧进行查找(反之亦然),查找时再次二分.这比顺序访问要少很多访问量,效率很高. 设:low ...

  7. java实现二分查找

    /** * 二分查找 * @param a * @param n * @param value * @return * @date 2016-10-8 * @author shaobn */ publ ...

  8. 【Python】二分查找算法

    二分查找:在一段数字内,找到中间值,判断要找的值和中间值大小的比较.如果中间值大一些,则在中间值的左侧区域继续按照上述方式查找.如果中间值小一些,则在中间值的右侧区域继续按照上述方式查找.直到找到我们 ...

  9. PHP实现文本快速查找 - 二分查找

    PHP实现文本快速查找 - 二分查找法 起因 先说说事情的起因,最近在分析数据时经常遇到一种场景,代码需要频繁的读某一张数据库的表,比如根据地区ID获取地区名称.根据网站分类ID获取分类名称.根据关键 ...

随机推荐

  1. [JZOJ 5697] 农场

    题目大意:将 n 个数 ai分成若干连续的段,使得每段的和都相等,求最多可以分成多少段. 思路: 考虑ai的和为sum,那么每一段的和就是约数. 对于每一个d,考虑其是否合法. 1e6之内用桶统计不会 ...

  2. map和unordered_map使用小结

    map和unordered_map unordered_map简介: #include <cstdio> #include <iostream> #include <un ...

  3. WebStorm+Node.js开发环境的配置

    1 下载地址:  webstorm:http://www.jetbrains.com/webstorm node.js:https://nodejs.org/download/ 2 安装node.js ...

  4. 数据分析相关概念(numpy)

    矢量 矢量是指一堆形成的集合. 多维数组也叫做矢量化计算. 单独一个数叫做标量 例: import datetime as dt import numpy as np n2=10000 start2 ...

  5. upper_bound() lower_bound() 用法

    头文件 #include<algorithm> #include<iostream>#include<vector>#include<algorithm> ...

  6. 【POJ】1182 食物链

    这是<挑战设计程序竞赛>中的例题. 题目链接:http://poj.org/problem?id=1182 题意:中文题面.不赘述. 题解: 代码: //带权并查集 #include< ...

  7. neo4j数据库迁移---------Neo4j数据库导入导出的方法

    Neo4j数据进行备份.还原.迁移的操作时,首先要关闭neo4j; /usr/share/neo4j/bin neo4j stop 如果出现 Neo4j not running 出现这种情况, Neo ...

  8. String 字符串对象

    String是什么 String字符串,是一种引用数据类型,并不是基础数据类型. 对于基础数据类型和引用数据类型的区别: 基础数据类型,在创建时直接将值存放在栈内存中. 引用数据类型,在创建时栈内存中 ...

  9. Visual Studio 2010 启动调试报错 “访问OLE注册表的错误”

    错误:访问OLE注册表的错误(异常来自HRESULT:0x8002801C(TYPE_E_REGISTRYACCESS)) 很简单,其实只要 “以管理员身份运行” Visual Studio即可.

  10. jquery.js和jquery.min.js的区别和springboot整合echarts.min.js

    1.区别:jquery官网提供2种jQuery的下载,一种是jquery.js另一种是jquery.min.js文件名不一定完全相同,但通常情况下:jquery.js是完整的未压缩的jQuery库,文 ...