认识:

  猜字游戏

步数 所猜的数 结果 可能值的范围
0     1~100
1 50 太高 1~49
2 25 太低 26~49
3 37 太高 26~36
4 31 太低 32~36
5 34 太高 32~33
6 32 太低 33~33
7 33 正确  

 二分法要求:

  有序数列

有序数组的java代码:

  

  1. package com.test;
  2.  
  3. /**
  4. * 二分查找
  5. * @author jingxin
  6. *
  7. */
  8. public class Test {
  9.  
  10. public static void main(String[] args) {
  11.  
  12. OrdArray array = new OrdArray(5);
  13.  
  14. array.insert(21);
  15. array.insert(1);
  16. array.insert(3);
  17. array.insert(4);
  18. array.insert(10);
  19.  
  20. array.display();
  21.  
  22. int i = array.find(3);
  23. System.out.println("二分查找:"+i);
  24.  
  25. array.delete(1);
  26.  
  27. array.display();
  28.  
  29. }
  30.  
  31. }
  32.  
  33. class OrdArray{
  34. private long[] a; //数组
  35. private int nElems; //数组下标
  36.  
  37. public OrdArray(int max){
  38. a = new long[max]; //初始化数组
  39. nElems = 0;
  40. }
  41.  
  42. /**
  43. * 返回数组的长度
  44. * @return
  45. */
  46. public int size(){
  47. return nElems;
  48. }
  49.  
  50. /**
  51. * 二分查找
  52. * @param searchKey 待查找的数
  53. * @return
  54. */
  55. public int find(long searchKey){
  56. int lowerBound = 0; // 二分起始下标
  57. int upperBound = nElems -1; // 二分终点下标
  58. int curIn; // 二分对半下标
  59.  
  60. while(true){
  61.   
              //对于偶数个数据项,中间值只取整数,不影响查找结果  
    curIn = (lowerBound + upperBound)/2;
  62. if(a[curIn] == searchKey){
  63. return curIn; // 找到了
  64. } else if(lowerBound > upperBound){
  65. return nElems; // 找不到返回元素个数
  66. } else{
  67. if(a[curIn] < searchKey){
  68. lowerBound = curIn + 1;
  69. } else{
  70. upperBound = curIn - 1;
  71. }
  72. }
  73. }
  74.  
  75. }
  76.  
  77. /**
  78. * 升序添加数组元素
  79. * @param value
  80. */
  81. public void insert(int value){
  82. int i;
  83. for (i = 0; i < nElems; i++) {
  84. if(a[i] > value){ // 线性查找,i存放符合条件的顺序元素
  85. break;
  86. }
  87. }
  88. for (int k = nElems; k>i; k--) { // 移动较大的数往上移
  89. a[k] = a[k-1];
  90. }
  91. a[i] = value;
  92. nElems++;
  93. }
  94.  
  95. /**
  96. * 删除数组元素
  97. * @param value
  98. * @return
  99. */
  100. public boolean delete(long value){
  101. int i = find(value);
  102. // eg:5个数则,nElems=5,而i只能是0~4
  103. if(i == nElems){
  104. return false; // 该元素不存在
  105. } else{
  106. for (int k = i; k < nElems-1; k++) { // 将更大的数往下移
  107. a[k] = a[k+1];
  108. }
  109. nElems--;
  110. return true;
  111. }
  112.  
  113. }
  114.  
  115. /**
  116. * 查看数组
  117. */
  118. public void display(){
  119. for (int i = 0; i < nElems; i++) {
  120. System.out.print(a[i]+ " ");
  121. }
  122. System.out.println("");
  123. }
  124.  
  125. }

二分查找所需的比较次数对照表:

范围 所需比较次数 该次数能查找的最大范围
10 4 16=2^4
100 7 128=2^7
1千 10 1024=2^10
1万 14 2^14
10万 17 2^17
100万 20 2^20
1000万 24 2^24
1亿 27 2^27

java数组之二分法查找的更多相关文章

  1. Java基础(50):二分法查找的非递归实现和递归实现(完整代码可运行,参考VisualGO理解更佳)

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

  2. Java冒泡排序与二分法查找的代码随笔

    package javafirst; import java.util.Arrays; class MaoPao{ //升序排列 /** * @param arr 要排序的数组 * @return i ...

  3. java数组回顾---线性查找最大值最小值---二分查找

    import java.util.Scanner; public class ArrayDemo { public static void main(String []args) { //------ ...

  4. java数组之binarySearch查找

    /** * 1.如果找到目标对象则返回<code>[公式:-插入点-1]</code> * 插入点:第一个大与查找对象的元素在数组中的位置,如果数组中的所有元素都小于要查找的对 ...

  5. java基础之二分法查找

    package p1; import java.util.*; public class Sortdob { public static void BubbleSort(int[] arr) {    ...

  6. Java数组之二分查找

    简单的二分查找 package com.kangkang.array; public class demo03 { public static void main(String[] args) { / ...

  7. C# -- 二分法查找

    二分法查找:适用于已经排序好的数组 1.二分法查找(入门案例) static void Main(string[] args) { , , , , , , , , , , , , , , , , , ...

  8. Java中数组二分法查找

    算法:当数组的数据量很大适宜采用该方法.采用二分法查找时,数据需是有序不重复的,如果是无序的也可通过选择排序.冒泡排序等数组排序方法进行排序之后,就可以使用二分法查找. 基本思想:假设数据是按升序排序 ...

  9. java基础-数组的折半查找原理

    java基础-数组的折半查找原理 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 如果让你写一个数组的查找功能,需求如下:在一个数组中,找一个元素,是否存在于数组中, 如果存在就返回 ...

随机推荐

  1. Newtonsoft.Json解析json字符串和写json字符串

    写: StringWriter sw = new StringWriter(); JsonWriter writer = new JsonWriter(sw); //如果报错则使用JsonWriter ...

  2. 在基于WCF开发的Web Service导出WSDL定义问题及自定义wsdl:port 名称

             在契约优先的Web服务开发过程中,往往是先拿到WSDL服务定义,各家开发各自的服务实现或客户端,然后互相调用.          尽管Web Service的标准已经发布很多年,但各 ...

  3. 关于“.WriteLine()是否需要这么多重载”的笔记

    在Stack Overflow上看到一个较热门的问题,作笔记于此. Console.WriteLine()有以下如此多的重载: public static void WriteLine(string ...

  4. jquery常用属性与方法

    1..css( )给指定的样式设置样式值: 2..attr(attributeName,value) /.removeAttr(attributeName);给指定的属性设置值 / 清除所有匹配的元素 ...

  5. BOM DOM区别 来源

    DOM 是为了操作文档出现的 API,document 是其的一个对象:BOM 是为了操作浏览器出现的 API,window 是其的一个对象. BOM是浏览器对象模型,DOM是文档对象模型,前者是对浏 ...

  6. vue-2.4.0-添加的新东东

    组件内新增实现属性继承 VUE中一个比较令人烦恼的事情是属性只能从父组件传递给子组件.这也就意味着当你想向嵌套层级比较深组件数据传递,只能由父组件传递给子组件,子组件再传递给孙子组件...像下面这样 ...

  7. MotionEvent的getX(),getY()与getRawX(),getRawY()区别

    在Android的View中getX  getRawX获取的坐标是不一样的,只是相对比照的对象不一样而已. 1.在View中: getX()是表示Widget相对于自身左上角的x坐标,而getRawX ...

  8. 微软RPC技术学习小结

    RPC,即Remote Procedure Call,远程过程调用,是进程间通信(IPC, Inter Process Communication)技术的一种.由于这项技术在自己所在项目(Window ...

  9. SAP CRM WebClient UI和Hybris backoffice UI开发的相同点

    CRM WebClient和Hybris backoffice的UI开发都不需要开发人员手写原生的html代码. CRM WebClient UI 在CRM WebUI workbench里,开发人员 ...

  10. cesium 加载倾斜摄影模型(这里有一坑)

    代码如下: // Construct the default list of terrain sources. var terrainModels = Cesium.createDefaultTerr ...