1. package Search;
  2.  
  3. public class biSearch {
  4. //标准的二分查找
  5. public static int stdBiSearch(int[] array,int keyValue) {
  6. int length=array.length;
  7. int left=0,right=length-1;
  8. while(left<=right){
  9. int mid=(left+right)/2;
  10. if(keyValue<array[mid]) right=mid-1;
  11. else if(keyValue>array[mid]) left=mid+1;
  12. else return mid;
  13. }
  14. return -1;
  15. }
  16.  
  17. //(二分法)查找第一个小于keyValue的元素
  18. public static int BiSearchToFindFirstSmaller(int[] array,int keyValue) {
  19. int length=array.length;
  20. int left=0,right=length-1;
  21. while(left<=right){
  22. int mid=(left+right)/2;
  23. if(keyValue<=array[mid]) right=mid-1;
  24. else left=mid+1;
  25. }
  26. return right;
  27. }
  28.  
  29. //(二分法)查找第一个大于等于keyValue的元素
  30. public static int BiSearchToFindFirstBiggerorEqual(int[] array,int keyValue) {
  31. int length=array.length;
  32. int left=0,right=length-1;
  33. while(left<=right){
  34. int mid=(left+right)/2;
  35. if(keyValue<=array[mid]) right=mid-1;
  36. else left=mid+1;
  37. }
  38. return left;
  39. }
  40.  
  41. //(二分法)查找第一个最后一个小于等于keyValue的元素
  42. public static int BiSearchToFindLastSmallerorEqual(int[] array,int keyValue) {
  43. int length=array.length;
  44. int left=0,right=length-1;
  45. while(left<=right){
  46. int mid=(left+right)/2;
  47. if(keyValue<array[mid]) right=mid-1;
  48. else left=mid+1;
  49. }
  50. return right;
  51. }
  52.  
  53. //(二分法)查找第一个第一个大于keyValue的元素
  54. public static int BiSearchToFindFirstBigger(int[] array,int keyValue) {
  55. int length=array.length;
  56. int left=0,right=length-1;
  57. while(left<=right){
  58. int mid=(left+right)/2;
  59. if(keyValue<array[mid]) right=mid-1;
  60. else left=mid+1;
  61. }
  62. return left;
  63. }
  64.  
  65. //(二分法)查找第一个第一个等于keyValue的元素
  66. public static int BiSearchToFindFirst(int[] array,int keyValue) {
  67. int length=array.length;
  68. int left=0,right=length-1;
  69. while(left<=right){
  70. int mid=(left+right)/2;
  71. if(keyValue<=array[mid]) right=mid-1;
  72. else left=mid+1;
  73. }
  74. //array[right]<keyValue<=array[left]
  75. if(left<length&&array[left]==keyValue) return left;
  76. else return -1;
  77. }
  78.  
  79. //(二分法)查找第一个最后一个等于keyValue的元素
  80. public static int BiSearchToFindLast(int[] array,int keyValue) {
  81. int length=array.length;
  82. int left=0,right=length-1;
  83. while(left<=right){
  84. int mid=(left+right)/2;
  85. if(keyValue<array[mid]) right=mid-1;
  86. else left=mid+1;
  87. }
  88. //array[right]<=keyValue<array[left]
  89. if(right>=0&&array[right]==keyValue) return right;
  90. else return -1;
  91. }
  92.  
  93. //测试样例
  94. public static void main(String[] args) {
  95. int[] a=new int[]{0,1,2,2,2,5,6};
  96. System.out.println(BiSearchToFindLast(a, 2));
  97. }
  98. }

一张图帮助理解:

参考博客地址: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. Android中的APK,TASK,PROCESS,USERID之间的关系

    开发Android已经有一段时间了,今天接触到底层的东西,所以对于进程,用户的id以及Android中的Task,Apk之间的关系,要做一个研究,下面就是研究结果: apk一般占一个dalvik,一个 ...

  2. Android中的SrollView滚动详解

    今天开发遇到一个需求就是ScrollView中嵌套一个ListView,同时需要实现滑动到底部自动加载更多,我们知道ListView滑动到底部简单实现onScrollListener()监听器即可,但 ...

  3. lsof 详解

    lsof常用参数 lsof 如果不加任何参数,就会打开所有被打开的文件,建议加上一下参数来具体定位lsof -i 列出所有网络连接lsof -i tcp 列出所有tcp连接信息lsof -i udp  ...

  4. NX二次开发-char*转换成CString,多字节转换成Unicode使用方法

    //定义一个结构体记录 struct group { CString text; //定义一个CString std::vector<tag_t> boudaries; std::vect ...

  5. D语言简介

    D语言,一种通用计算机程序语言,威力强大.功能丰富,支持多种编程范式,例如面向对象.[1]  D语言最初由Digital Mars公司就职的Walter Bright于2001年发布,意图改进C++语 ...

  6. webstorm快捷键、支持vue文件等部分使用技巧

    转载:https://www.cnblogs.com/seven077/p/9771474.html 1.常用快捷键 shift+↑ 向上选取代码块shift+↓ 向下选取代码块ctrl+/ 注释/取 ...

  7. prettier包升级后vue项目运行报错

    今天用vue-cli新建vue项目的时候,发现项目怎么都跑不起来. 最后通过与以前项目作比较,发现prettier这个依赖的版本从原来的1.12.0升级成了1.13.1.我也不太清楚为什么升级后项目跑 ...

  8. Docker学习のC/S模式

    我们操作docker是通过命令行客户端,然后和守护进程通信 以前的是通过命令行 我们还可以通过RemoApI的形式,通过自己的程序访问docker 和守护进程链接方式

  9. windows下执行tensorflow/models的代码显示No module named 'object_detection'

    Traceback (most recent call last): File "object_detection/builders/model_builder_test.py", ...

  10. 2019-5-21-dotnet-使用-GC.GetAllocatedBytesForCurrentThread-获取当前线程分配过的内存大小...

    title author date CreateTime categories dotnet 使用 GC.GetAllocatedBytesForCurrentThread 获取当前线程分配过的内存大 ...