详解Java数据结构和算法(有序数组和二分查找)
作者:临窗听雨 发布时间:2023-04-08 13:38:07
标签:Java,有序数组,二分查找
一、概述
有序数组中常常用到二分查找,能提高查找的速度。今天,我们用顺序查找和二分查找实现数组的增删改查。
二、有序数组的优缺点
优点:查找速度比无序数组快多了
缺点:插入时要按排序方式把后面的数据进行移动
三、有序数组和无序数组共同优缺点
删除数据时必须把后面的数据向前移动来填补删除项的漏洞
四、代码实现
public class OrderArray {
private int nElemes; //记录数组长度
private long[] a;
/**
* 构造函数里面初始化数组 赋值默认长度
*
* @param max
*/
public OrderArray(int max){
this.a = new long[max];
nElemes = 0;
}
//查找方法 (二分查找)
public int find(long searchElement){
int startIndex = 0;
int endIndex = nElemes-1;
int curIn;
while(true){
curIn = (startIndex + endIndex)/2;
if(a[curIn]==searchElement){
return curIn; //找到
}else if(startIndex>endIndex){ //沒有找到
return nElemes; //返回大于最大索引整数
}else{ //还要继续找
if(a[curIn]<searchElement){
startIndex = curIn + 1; //改变最小索引
}else{ //往前找
endIndex = curIn -1;
}
}
}
}
//插入元素(线性查找)
public void insert(long value){
int j;
for(j=0;j<nElemes;j++){
if(a[j]>value){
break;
}
}
for(int k=nElemes;k>j;k--){
a[k] = a[k-1];
}
a[j] = value;
nElemes++;
}
//删除数据项
public boolean delete(long value){
int j = find(value);
if(j==nElemes){
return false; //没找到
}else{
//所有元素往前移动一位
for(int k=j;k<nElemes;k++)
a[k] = a[k+1];
nElemes--;
return true;
}
}
//展示的方法
public void display(){
for(int i=0;i<nElemes;i++){
System.out.print(a[i]+" ");
}
}
public int size(){
return nElemes;
}
}
五、测试
public static void main(String[] args) {
int max = 100;
OrderArray oa = new OrderArray(max);
oa.insert(12);
oa.insert(14);
oa.insert(90);
oa.insert(89);
oa.insert(87);
oa.insert(88);
oa.insert(67);
oa.display();
int searchkey = 90;
if(oa.find(searchkey)!=oa.size()){
System.out.println("found"+searchkey);
}else{
System.out.println("not found");
}
oa.delete(88);
oa.delete(90);
oa.delete(89);
oa.display();
}
来源:http://www.jianshu.com/p/8f5f8c04b531?utm_source=tuicool&utm_medium=referral
0
投稿
猜你喜欢
- 引言使用标准框架验证Java bean的基础知识 - JSR 380,也称为Bean Validation 2.0。当然,验证用户输入在大多
- 初学线程时,总是将 run 方法和 start 方法搞混,虽然二者是完全不同的两个方法,但刚开始使用时很难分清,原因就是因为初次使用时效果貌
- 本文实例讲述了C#实现把图片转换成二进制以及把二进制转换成图片的方法。分享给大家供大家参考,具体如下:private void button
- java 中编写 GUI 有两中工具包,分别为 AWT、Swing。Swing 是 AWT 的拓展,Swing 具有比 AWT 丰富的组件和
- 前言在电商的应用中,最常见的就是在首页或完成某事件之后,弹出一堆的活动/广告。假如重叠弹出,很丑,给用户的体验也不好,所以一般都会依次依条件
- 废话目前流行的前后端分离让Java程序员可以更加专注的做好后台业务逻辑的功能实现,提供如返回Json格式的数据接口就可以。SpringBoo
- 二维数组实现数字拼图,供大家参考,具体内容如下二维数组可以自己随意定义大小,通过方法判断来实现对所有的数字进行随机打乱,并可以通过移动来正确
- 目录1.@ 根据id更新2.@ 条件构造器作为参数进行更新3.@ lambda构造器mybatisplus update语句为null时没有
- 一、是什么当下很多公司都采取前后端分离的开发模式,前端和后端的工作由不同的工程师完成。在这种开发模式下,维持一份及时更新且完整的 Rest
- java * 的方法总结AOP的拦截功能是由java中的 * 来实现的。说白了,就是在目标类的基础上增加切面逻辑,生成增强的目标类(该
- 选择排序:(Selection sort)是一种简单直观的排序算法,也是一种不稳定的排序方法。选择排序的原理一组无序待排数组,做升序排序,我
- 一、Future 接口当 call()方法完成时,结果必须存储在主线程已知的对象中,以便主线程可以知道该线程返回的结果。为此,可以使用 Fu
- Environment的中文意思是环境,它表示整个spring应用运行时的环境信息,它包含两个关键因素profilespropertiesp
- 前言Stream是一个来自数据源的元素队列并支持聚合操作,其中具有以下特性:Stream只负责计算,不存储任何元素,元素是特定类型的对象,形
- 本文介绍了Spring Boot 开发REST接口最佳实践,分享给大家,具体如下:HTTP动词与SQL命令对应GET从服务器获取资源,可一个
- 1.将本地jar包放入本地仓库。只需执行如下命令即可:mvn install:install-file -Dfile=D:/demo/fib
- 你是一名体育老师,在某次课距离下课还有五分钟时,你决定搞一个游戏。此时有100名学生在上课。游戏的规则是:1. 你首先说出三个不同的特殊数,
- MyBatis是支持定制化SQL、存储过程以及高级映射的优秀的持久层框架,避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。spri
- 验证码的实现原理: 在一个Servlet中生成验证,并把验证码上的数据保存在Session,用户提交验证码之后,会提交给另外一个
- 配置步骤:1.导入Spring整合Junit的jar(坐标):<dependency> <gr