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. 硬核二分——cf985D

    分两种情况进行讨论,要注意判条件时会有爆ll #include<bits/stdc++.h> using namespace std; #define ll long long ll n, ...

  2. hive的行列互转

    行转列 多行转多列 数据表 row2col col1 col2 col3 a c 1 a d 2 a e 3 b c 4 b d 5 b e 6 现在要将其转化为: col1 c d e a 1 2 ...

  3. 原生js实现文件下载并设置请求头header

    原生js实现文件下载并设置请求头header const token="自行定义";//如果有 /** * 向指定路径发送下载请求 * @param{String} url 请求路 ...

  4. bat命令自用其(一)

    每秒钟打印ping命令结果到指定文件: @echo off set /p ip=Input the IP required to monitor: :starts echo %date% %time% ...

  5. 剑指offer——21正则表达式匹配

    题目描述 请实现一个函数用来匹配包括'.'和'*'的正则表达式.模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次). 在本题中,匹配是指字符串的所有字符匹配整个模式 ...

  6. C盘清理垃圾

    经常清理C盘垃圾,会让系统运行更快,避免死机,今天教大家一种简单实用的方法,用文本文档清理垃圾: 1:在电脑桌面空白处右键-建立文本文档: 2:把以下代码复制到文本里 @echo offecho 正在 ...

  7. kettle 中 java.lang.ClassCastException: [B cannot be cast to java.lang.String报错的解决方法

    问题描述:从数据库中查询出的某字段是json类型数据,然后在json输入步骤报错java.lang.ClassCastException: [B cannot be cast to java.lang ...

  8. try-with-resources with JDBC

    I realize this was long ago answered but want to suggest an additional approach that avoids the nest ...

  9. 【笔记篇】(理论向)快速傅里叶变换(FFT)学习笔记w

    现在真是一碰电脑就很颓废啊... 于是早晨把电脑锁上然后在旁边啃了一节课多的算导, 把FFT的基本原理整明白了.. 但是我并不觉得自己能讲明白... Fast Fourier Transformati ...

  10. ConvertBSTRToString导致的内存泄漏

    函数原型 char* __stdcall ConvertBSTRToString(BSTR pSrc); 这个指针指向的是一块动太分配的内存,如果把这个函数做为其它函数的参数,那么这块内存就会被泄漏掉 ...