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基础-数组的折半查找原理 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 如果让你写一个数组的查找功能,需求如下:在一个数组中,找一个元素,是否存在于数组中, 如果存在就返回 ...
随机推荐
- Cannot convert value '0000-00-00 00:00:00' from column 1 to TIMESTAMP解决办法
在Mysql数据库中使用DATETIME类型来存储时间,使用JDBC中读取这个字段的时候,应该使用 ResultSet.getTimestamp(),这样会得到一个java.sql.Timestamp ...
- C#设计模式——单例
单例模式是设计模式中最简单的形式之一.这一模式的目的是使得类的一个对象成为系统中的唯一实例.对于系统中的某些类来说,只有一个实例很重要,例如,一个系统中可以存在多个打印任务,但是只能有一个正在工作的任 ...
- Windows Store 应用获得设备 ID 的几种方案
本文为个人博客备份文章,原文地址: http://validvoid.net/solutions-get-device-id-for-uwp/ 通过生成唯一的设备 ID 进行数据统计是应用开发中一个非 ...
- 使用Aspose.Cell控件实现Excel高难度报表的生成
1.使用Aspose.Cell控件实现Excel高难度报表的生成(一) http://www.cnblogs.com/wuhuacong/archive/2011/02/23/1962147.html ...
- 在DataColumn.Expression把DateTime转换成String的问题
我在使用MySql5.1的数据库中,使用winForm的DataGridView要把数据库中全称DateTime格式,转换成Date格式,就是把日期时间转换成日期,不要时间.如‘2013-07-08 ...
- cf914F. Substrings in a String(bitset 字符串匹配)
题意 题目链接 Sol Orz jry 和上一个题一个思路吧,直接bitset乱搞,不同的是这次有了修改操作 因为每次修改只会改两个位置,直接暴力改就好了 #include<bits/stdc+ ...
- node-sass 安装报错解决办法
npm install安装node-sass时出现以下问题: Cannot download https://github.com/sass/node-sass/releases/download/v ...
- [原创] Debian9上配置软件阵列
序言 软阵列是用软件实现的磁盘阵列. 准备工作 1. 更新系统 没啥,就他喵想用个最新的. apt update && apt upgrade 2. 安装mdadm 如果系统没有自带m ...
- tomcat启动部署APP报错:This is very likely to create a memory leak
This is very likely to create a memory leak的错误,网上很多,原因也是各种各样,这里也仅提供一个解决的思路. 问题描述:启动tomcat时,不能访问部署的AP ...
- Azure 5 月新公布
Azure 5 月新发布:CDN 高级版服务降价,MySQL Database 高级版本和新功能,以及应用程序网关中的 WAF 层发布 Azure CDN 高级版服务自 2017 年 5 月 1 ...