认识:

  猜字游戏

步数 所猜的数 结果 可能值的范围
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代码:

  

 package com.test;

 /**
* 二分查找
* @author jingxin
*
*/
public class Test { public static void main(String[] args) { OrdArray array = new OrdArray(5); array.insert(21);
array.insert(1);
array.insert(3);
array.insert(4);
array.insert(10); array.display(); int i = array.find(3);
System.out.println("二分查找:"+i); array.delete(1); array.display(); } } class OrdArray{
private long[] a; //数组
private int nElems; //数组下标 public OrdArray(int max){
a = new long[max]; //初始化数组
nElems = 0;
} /**
* 返回数组的长度
* @return
*/
public int size(){
return nElems;
} /**
* 二分查找
* @param searchKey 待查找的数
* @return
*/
public int find(long searchKey){
int lowerBound = 0; // 二分起始下标
int upperBound = nElems -1; // 二分终点下标
int curIn; // 二分对半下标 while(true){
  
          //对于偶数个数据项,中间值只取整数,不影响查找结果  
curIn = (lowerBound + upperBound)/2;
if(a[curIn] == searchKey){
return curIn; // 找到了
} else if(lowerBound > upperBound){
return nElems; // 找不到返回元素个数
} else{
if(a[curIn] < searchKey){
lowerBound = curIn + 1;
} else{
upperBound = curIn - 1;
}
}
} } /**
* 升序添加数组元素
* @param value
*/
public void insert(int value){
int i;
for (i = 0; i < nElems; i++) {
if(a[i] > value){ // 线性查找,i存放符合条件的顺序元素
break;
}
}
for (int k = nElems; k>i; k--) { // 移动较大的数往上移
a[k] = a[k-1];
}
a[i] = value;
nElems++;
} /**
* 删除数组元素
* @param value
* @return
*/
public boolean delete(long value){
int i = find(value);
// eg:5个数则,nElems=5,而i只能是0~4
if(i == nElems){
return false; // 该元素不存在
} else{
for (int k = i; k < nElems-1; k++) { // 将更大的数往下移
a[k] = a[k+1];
}
nElems--;
return true;
} } /**
* 查看数组
*/
public void display(){
for (int i = 0; i < nElems; i++) {
System.out.print(a[i]+ " ");
}
System.out.println("");
} }

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

范围 所需比较次数 该次数能查找的最大范围
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. HDU 5353—— Average——————【贪心+枚举】

    Average Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total S ...

  2. HttpClient4.3.3 禁止自动重定向

    HttpClient4.3中默认允许自动重定向,导致程序中不能跟踪跳转情况,其实只需要在RequestConfig中setRedirectsEnabled(false)即可(默认是true): pri ...

  3. 基于HTTP协议之WEB消息实时推送技术原理及实现

    很早就想写一些关于网页消息实时推送技术方面的文章,但是由于最近实在忙,没有时间去写文章.本文主要讲解基于 HTTP1.1 协议的 WEB 推送的技术原理及实现.本人曾经在工作的时候也有做过一些用到网页 ...

  4. C#开发短信的方法和简介(转)

    http://ce.sysu.edu.cn/hope2008/Education/ShowArticle.asp?ArticleID=6337(来自) 自己收藏哈子

  5. html table 的属性

    表格table th,td 文字顶部对齐 <th valign="top"></th> <td valign="top">& ...

  6. 关于css实现单行、多行省略标记

    实现单行: overflow: hidden; text-overflow:ellipsis; white-space: nowrap; 实现多行: display: -webkit-box; -we ...

  7. 《Cron表达式详解》

    Cron表达式是一个字符串,字符串以5或6个空格隔开,分为6或7个域,每一个域代表一个含义,Cron有如下两种语法格式: Seconds Minutes Hours DayofMonth Month ...

  8. Angular JS + Express JS入门搭建网站

    3月份开始,接到了新的任务,跟UI开发有关,用的是Angular JS,Express JS等技术.于是周末顺便学习下新技术. 组里产品UI架构如下: 其中前端,主要使用Angular JS框架,另外 ...

  9. u-boot分析(八)----串口初始化

    u-boot分析(八) 上篇博文我们按照210的启动流程,分析到了内存初始化,今天我们继续按照u-boot的启动流程对串口的初始化进行分析. 今天我们会用到的文档: 1.        2440芯片手 ...

  10. Js arguments.callee();函数自己调用自己

    1.阶乘的时候,函数一般要用到递归算法,所以函数内部一定会调用自身 //递归,阶乘 function sum(num){ ) { ; } else{ ); //自己调用自己,递归 } } alert( ...