java面向对象的有序数组和无序数组的比较
package aa;
class Array{
//定义一个有序数组
private long[] a;
//定义数组长度
private int nElems;
//构造函数初始化
public Array(int max){
a = new long[max];
nElems = 0;
}
//size函数
public int size(){
return nElems;
}
//定义添加函数
public void insert(long value){
//将value赋值给数组成员
a[nElems] = value;
//然后将数组长度加一
nElems ++;
long temp;
//用冒泡法排序
for(int i = 0; i < nElems - 1; i ++)
{
for(int j = 0; j < nElems - 1 - i; j++)
{
if(a[j] > a[j + 1])
{
temp = a[j];
a[j] = a[j + 1];
a[j + 1] = temp;
}
}
}
}
//定义查找方法
public int find(long searchKey){
//因为是有序数组,我们可以用二分法来查找时间为 O(logN),如果线性查找则为O(N) //下限
int lowerBound = 0;
//上限
int upperBound = nElems -1;
//中间值
int curIndex; while(true)
{
curIndex = (lowerBound + upperBound) / 2;
if(a[curIndex] == searchKey)
{
return curIndex;
}
else if(lowerBound > upperBound)
{
return nElems;
}
else
{
if(a[curIndex] > searchKey)
{
upperBound = curIndex -1;
}
else
{
lowerBound = curIndex + 1;
} }
} }
//定义删除方法
public boolean delete(long value){
int index = find(value);
if(index == size())
{
return false;
}
else
{
for(int i = index; i < size(); i++)
{
a[i] = a[i + 1];
}
nElems --;
return false;
}
}
//定义显示方法
public void display(){
for(int j = 0; j < nElems; j++)
{
System.out.println(a[j] + " ");
}
System.out.println("");
} }
public class Arr {
public static void main(String[] args)
{
int maxSize = 100;
Array arr = new Array(maxSize);
arr.insert(77);
arr.insert(99);
arr.insert(44);
arr.insert(55);
arr.insert(22);
arr.insert(88);
arr.insert(11);
arr.insert(22);
arr.insert(66);
arr.insert(33);
arr.display();
int searchKey = 54;
if(arr.find(searchKey) != arr.size())
{
System.out.println("found" + searchKey);
}
else
{
System.out.println("cant find" + searchKey);
} arr.delete(22);
arr.delete(55);
arr.delete(99); arr.display();
}
}
package aa;
//定义一个无序数组
class HighArray{
private long[] a;
private int nElems; public HighArray(int max)
{
a = new long[max];
nElems = 0;
} public boolean find(long searchKey)
{
int j;
for(j = 0; j < nElems; j++)
{
if(a[j] == searchKey)
{
break;
}
}
if(j == nElems)
{
return false;
}
else
{
return true;
}
} public void insert(long value)
{
a[nElems] = value;
nElems++;
} public boolean delete(long value)
{
int j;
for(j = 0; j < nElems; j++)
{
if(value == a[j])
{
break;
} }
if(j == nElems)
{
return false;
}
else
{
for(int k = j; k < nElems; k++)
{
a[k] = a[k+1];
}
nElems --;
return true; }
}
public void display()
{
for(int j = 0; j < nElems; j++)
{
System.out.println(a[j] + "");
}
System.out.println("");
}
}
public class highArrayApp {
public static void main(String[] args)
{
int maxSize = 100;
HighArray arr = new HighArray(maxSize); arr.insert(77);
arr.insert(99);
arr.insert(44);
arr.insert(55);
arr.insert(22);
arr.insert(88);
arr.insert(11);
arr.insert(00);
arr.insert(66);
arr.insert(33); arr.display(); int searchKey = 35; if(arr.find(searchKey))
{
System.out.println("Found" + searchKey);
}
else
{
System.out.println("cant find" + searchKey); }
arr.delete(00);
arr.delete(55);
arr.delete(99); arr.display();
}
}
大O表示法
O(1):优秀。例如无须数组插入。
O(logN):良好。例如有序的二分查找。
O(N):及格。例如无序数组的删除,有序数组的删除和插入,线性查找。
O(N2):不及格。例如冒泡排序。
总结有序数组和无序数组
有序数组:插入+ 查找 +删除 = O(N) +O(logN)+O(N);
无序数组:插入 + 查找 + 删除 = O(1) + O(N) + O(N);
所以在数据偏向查找操作的时候用有序数组快一些,在数据偏向插入的时候,无序数组好一些。删除操作效率一样。
java面向对象的有序数组和无序数组的比较的更多相关文章
- JAVA面向对象-----值交换(基本数据类型 数组类型 对象的值 字符串的)
JAVA面向对象-–值交换 基本数据类型交换 数组类型交换 对象的值交换 字符串的值交换 恩,没错,又是贴图,请大家见谅,我也是为了多写几个文章,请大家谅解. 字符串的值交换: 交换值失败. 这个文章 ...
- 【算法】字典的诞生:有序数组 PK 无序链表
参考资料 <算法(java)> — — Robert Sedgewick, Kevin Wayne <数据结构> ...
- 【算法】实现字典API:有序数组和无序链表
参考资料 <算法(java)> — — Robert Sedgewick, Kevin Wayne <数据结构> ...
- java - day005 - 数组工具类, 数组复制,二维数组,变量,方法, 面向对象
1. java.util.Arrays 数组工具类 Arrays.toString (数组) 数组值链接字符串 Arrays.sort(数组) 基本类型: 优化的快速排序 引用类型: 优化的合 ...
- java:合并两个排序的整数数组A和B变成一个新的数组。新数组也要有序。
合并两个排序的整数数组A和B变成一个新的数组.新数组也要有序. 样例 1: 输入: A=[1], B=[1] 输出:[1,1] 样例解释: 返回合并后的数组. 样例 2: 输入: A=[1,2,3,4 ...
- 对无序数组的并发搜索的java实现
对无序数组的并发搜索的实现可以充分的用到多cpu的优势 一种简单的策略是将原始数组按照期望的线程数进行分割,如果我们计划使用两个线程进行搜索,就可以把一个数组分成两个,每个线程各自独立的搜索,当其中有 ...
- Java数据结构和算法(二)——数组
上篇博客我们简单介绍了数据结构和算法的概念,对此模糊很正常,后面会慢慢通过具体的实例来介绍.本篇博客我们介绍数据结构的鼻祖——数组,可以说数组几乎能表示一切的数据结构,在每一门编程语言中,数组都是重要 ...
- java版数据结构与算法第二章数组
数组由一组具有相同类型的数据元素组成,并存储在一组连续存储单元中.一维数组是常量. 二维数组:若一维数组中的数据元素又是一堆数据结构,我们称之为二维数组.二维数组可以看成是n个列向量组成的线性表. 数 ...
- Java学习日记基础篇(七) —— 数组、排序
数组 为什么要有数组? 案例:一个养鸡场有六只鸡,他们的体重分别为3kg,5kg,1kg,3.4kg,2kg,50kg.请问这六只鸡的总体重和平均体重是多少? public class test5 { ...
随机推荐
- Apache安装排错
今天安装一下Apache,发现报错,且在网上没有找到相关解决方法,所以记录一下 安装步骤:将下载好的apache包放置到要放置的目录中,最好是盘根目录下,然后命令行下进入到apache下面的bin目录 ...
- Vue中,给当前元素添加类名移除兄弟元素类名的方法
在Vue中,给当前元素添加类名移除兄弟元素类名的方法 今天在项目中需要做一个效果,点击对应的li改变当前的color,其他的li取消颜色,在jQuery中这很容易,由于之前已经引入了jQuery,所以 ...
- mysql 5.7 或以上版本 group by 问题记录
mysql 5.7或以上的新版本sql_mode 默认开启开 ONLY_FULL_GROUP_BY,如果 select 中出现的字段,没有使用聚合函数,或不存在group by中就会提示,this i ...
- 【gitlab平台的搭建】
gitlab同github相同,具有把源码集中存放的功能,同时依靠git进行code的同步,在实际的开发过程中可保证团队的项目同步,同时便于便于维护等 #下载这个rpm包 #gitlab.rb访问地址 ...
- swiper 导航有多个,被点击的项居中显示。
<div class="swiper-container"> <div class="swiper-wrapper"> <div ...
- Java Hibernate Validator
Hibernate Validator是Hibernate提供的一个开源框架,使用注解方式非常方便的实现服务端的数据校验. 官网:http://hibernate.org/validator/ hib ...
- Redis开启远程访问及密码认证
配置 redis.conf 文件 [root@localhost bin]# vi /usr/local/redis/bin/redis.conf 将 bind 127.0.0.1 注释掉 将 pro ...
- md5.digest()与md5.hexdigest()之间的区别及转换
举给例子 md5 = hashlib.md5('adsf') md5.digest() //返回: '\x05\xc1*(s48l\x94\x13\x1a\xb8\xaa\x00\xd0\x8a' # ...
- Fiddler抓取手机APP数据包
第一步:下载神器Fiddler,下载链接: http://w.x.baidu.com/alading/anquan_soft_down_ub/10963 下载完成之后,傻瓜式的安装一下了! 第二步:设 ...
- Linux入门第五天——shell脚本入门(下)基础语法之循环
一.循环 1.不定循环 有两种形式: while [ condition ] <==中括号内的状态就是判断式 do <==do 是循环的开始! 程序段落 done <==done 是 ...