java数组之二分法查找
2024-09-04 13:16:24
认识:
猜字游戏
步数 | 所猜的数 | 结果 | 可能值的范围 |
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 |
最新文章
- iOS中怎么存储照片到自定义相册
- MFCC可视化
- Effective C++ -----条款45:运用成员函数模板接受所有兼容类型
- ArcMap中的名称冲突问题
- SPOJ962 Intergalactic Map(最大流)
- string,vector和array(C++ Primer读书笔记)
- Mediator 中介者 协调者模式
- 梯度下降算法的一点认识(Ng第一课)
- 迷宫城堡(强联通targin)
- 提高运维效率(二)桌面显示IP
- C:数据结构与算法之顺序表
- python环境jieba分词的安装
- &#39;ascii&#39; codec can&#39;t decode byte 0xe5 in position 10: ordinal not in range(128)
- SpringMVC Controller 返回值几种类型
- c# word操作篇,解决字符串长度超过255就不能替换的问题
- apache伪静态配置(URL重写)
- Flume连接oracle实时推送数据到kafka
- 洛谷 P3302 [SDOI2013]森林
- Python 日志管理封装
- SCSI Pass-Through Interface Tool