java数组之二分法查找
认识:
猜字游戏
| 步数 | 所猜的数 | 结果 | 可能值的范围 |
| 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数组之二分法查找的更多相关文章
- Java基础(50):二分法查找的非递归实现和递归实现(完整代码可运行,参考VisualGO理解更佳)
一.概念 二分查找算法也称折半查找,是一种在有序数组中查找某一特定元素的搜索算法. 二.算法思想 搜素过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束:如果某一特定元素大于或者 ...
- Java冒泡排序与二分法查找的代码随笔
package javafirst; import java.util.Arrays; class MaoPao{ //升序排列 /** * @param arr 要排序的数组 * @return i ...
- java数组回顾---线性查找最大值最小值---二分查找
import java.util.Scanner; public class ArrayDemo { public static void main(String []args) { //------ ...
- java数组之binarySearch查找
/** * 1.如果找到目标对象则返回<code>[公式:-插入点-1]</code> * 插入点:第一个大与查找对象的元素在数组中的位置,如果数组中的所有元素都小于要查找的对 ...
- java基础之二分法查找
package p1; import java.util.*; public class Sortdob { public static void BubbleSort(int[] arr) { ...
- Java数组之二分查找
简单的二分查找 package com.kangkang.array; public class demo03 { public static void main(String[] args) { / ...
- C# -- 二分法查找
二分法查找:适用于已经排序好的数组 1.二分法查找(入门案例) static void Main(string[] args) { , , , , , , , , , , , , , , , , , ...
- Java中数组二分法查找
算法:当数组的数据量很大适宜采用该方法.采用二分法查找时,数据需是有序不重复的,如果是无序的也可通过选择排序.冒泡排序等数组排序方法进行排序之后,就可以使用二分法查找. 基本思想:假设数据是按升序排序 ...
- java基础-数组的折半查找原理
java基础-数组的折半查找原理 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 如果让你写一个数组的查找功能,需求如下:在一个数组中,找一个元素,是否存在于数组中, 如果存在就返回 ...
随机推荐
- HDU 5353—— Average——————【贪心+枚举】
Average Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Total S ...
- HttpClient4.3.3 禁止自动重定向
HttpClient4.3中默认允许自动重定向,导致程序中不能跟踪跳转情况,其实只需要在RequestConfig中setRedirectsEnabled(false)即可(默认是true): pri ...
- 基于HTTP协议之WEB消息实时推送技术原理及实现
很早就想写一些关于网页消息实时推送技术方面的文章,但是由于最近实在忙,没有时间去写文章.本文主要讲解基于 HTTP1.1 协议的 WEB 推送的技术原理及实现.本人曾经在工作的时候也有做过一些用到网页 ...
- C#开发短信的方法和简介(转)
http://ce.sysu.edu.cn/hope2008/Education/ShowArticle.asp?ArticleID=6337(来自) 自己收藏哈子
- html table 的属性
表格table th,td 文字顶部对齐 <th valign="top"></th> <td valign="top">& ...
- 关于css实现单行、多行省略标记
实现单行: overflow: hidden; text-overflow:ellipsis; white-space: nowrap; 实现多行: display: -webkit-box; -we ...
- 《Cron表达式详解》
Cron表达式是一个字符串,字符串以5或6个空格隔开,分为6或7个域,每一个域代表一个含义,Cron有如下两种语法格式: Seconds Minutes Hours DayofMonth Month ...
- Angular JS + Express JS入门搭建网站
3月份开始,接到了新的任务,跟UI开发有关,用的是Angular JS,Express JS等技术.于是周末顺便学习下新技术. 组里产品UI架构如下: 其中前端,主要使用Angular JS框架,另外 ...
- u-boot分析(八)----串口初始化
u-boot分析(八) 上篇博文我们按照210的启动流程,分析到了内存初始化,今天我们继续按照u-boot的启动流程对串口的初始化进行分析. 今天我们会用到的文档: 1. 2440芯片手 ...
- Js arguments.callee();函数自己调用自己
1.阶乘的时候,函数一般要用到递归算法,所以函数内部一定会调用自身 //递归,阶乘 function sum(num){ ) { ; } else{ ); //自己调用自己,递归 } } alert( ...