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基础-数组的折半查找原理 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 如果让你写一个数组的查找功能,需求如下:在一个数组中,找一个元素,是否存在于数组中, 如果存在就返回 ...
随机推荐
- 本机访问其它电脑上的oracle数据库
最近发现很多人问到怎么才能访问别人机子上的oracle,这里来给大家做个示范 借助工具的话,oracle就自己带了两个配置和移值助手下面:net configuration assistant 和ne ...
- B树和B+树对比,为什么MySQL数据库索引选择使用B+树?
一 基础知识 二叉树 根节点,第一层的节点 叶子节点,没有子节点的节点. 非叶子节点,有子节点的节点,根节点也是非叶子节点. B树 B树的节点为关键字和相应的数据(索引等) B+树 B+树是B树的一个 ...
- javascript 数组方法拼接html标签
var htmls = new Array(); htmls.push("<tr class='otherinfotr'>");htmls.push("< ...
- java实现两个整数相除保留一位小数
//整数相除 保留一位小数 public static String division(int a ,int b){ String result = ""; float num = ...
- [转]c#匿名类
首先让我们看一个例子, 假设我们并没有Person类, 并且我们关心的属性只有Name和Age. 下面的代码演示了我们如何在没有声明类型的情况下来构建一个对象的: 1: var tom = new { ...
- 链表例题2:链表的倒数第k个节点是多少
解题思想: 1.创建一个结点类(为后面实现链表做基础) 2.创建一个查询倒数元素的方法 3.使用快慢指针的思想(主要的部分) 图中的表示的是查询倒数第k个结点的操作: 创建一个快慢指针后pre(慢指针 ...
- springboot从入门到精通(一)
springboot到底有什么好处?有什么优势?这个先不用看,我们只要知道它有很多优势,现在要做的事只有一件,那就是撸代码!撸完就知道有多少料! 首先,在案例中,我们会构建一个英雄列表应用.操作如下: ...
- python反爬之懒加载
# 在平时的爬虫中,如果遇到没有局部刷新,没有字体加密,右键检查也能看到清晰的数据,但是按照已经制定好的解析规则进行解析时,会返回空数据,这是为什么呢,这时可以在网页右键查看一下网页源代码,可以发现, ...
- PHP Regex
<?php //Accpet the http client request and generate response content. //As a demo, this function ...
- linux下查找字符串
如果你想在当前目录下 查找"hello,world!"字符串,可以这样: grep -rn "hello,world!" * * : 表示当前目录所有文件,也可 ...