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面向对象的有序数组和无序数组的比较的更多相关文章

  1. JAVA面向对象-----值交换(基本数据类型 数组类型 对象的值 字符串的)

    JAVA面向对象-–值交换 基本数据类型交换 数组类型交换 对象的值交换 字符串的值交换 恩,没错,又是贴图,请大家见谅,我也是为了多写几个文章,请大家谅解. 字符串的值交换: 交换值失败. 这个文章 ...

  2. 【算法】字典的诞生:有序数组 PK 无序链表

    参考资料 <算法(java)>                           — — Robert Sedgewick, Kevin Wayne <数据结构>       ...

  3. 【算法】实现字典API:有序数组和无序链表

    参考资料 <算法(java)>                           — — Robert Sedgewick, Kevin Wayne <数据结构>       ...

  4. java - day005 - 数组工具类, 数组复制,二维数组,变量,方法, 面向对象

    1. java.util.Arrays  数组工具类    Arrays.toString (数组) 数组值链接字符串 Arrays.sort(数组) 基本类型: 优化的快速排序 引用类型: 优化的合 ...

  5. java:合并两个排序的整数数组A和B变成一个新的数组。新数组也要有序。

    合并两个排序的整数数组A和B变成一个新的数组.新数组也要有序. 样例 1: 输入: A=[1], B=[1] 输出:[1,1] 样例解释: 返回合并后的数组. 样例 2: 输入: A=[1,2,3,4 ...

  6. 对无序数组的并发搜索的java实现

    对无序数组的并发搜索的实现可以充分的用到多cpu的优势 一种简单的策略是将原始数组按照期望的线程数进行分割,如果我们计划使用两个线程进行搜索,就可以把一个数组分成两个,每个线程各自独立的搜索,当其中有 ...

  7. Java数据结构和算法(二)——数组

    上篇博客我们简单介绍了数据结构和算法的概念,对此模糊很正常,后面会慢慢通过具体的实例来介绍.本篇博客我们介绍数据结构的鼻祖——数组,可以说数组几乎能表示一切的数据结构,在每一门编程语言中,数组都是重要 ...

  8. java版数据结构与算法第二章数组

    数组由一组具有相同类型的数据元素组成,并存储在一组连续存储单元中.一维数组是常量. 二维数组:若一维数组中的数据元素又是一堆数据结构,我们称之为二维数组.二维数组可以看成是n个列向量组成的线性表. 数 ...

  9. Java学习日记基础篇(七) —— 数组、排序

    数组 为什么要有数组? 案例:一个养鸡场有六只鸡,他们的体重分别为3kg,5kg,1kg,3.4kg,2kg,50kg.请问这六只鸡的总体重和平均体重是多少? public class test5 { ...

随机推荐

  1. 截屏状态监听 - iOS

    既接到电话状态监听的需求之后再次添加了截屏状态的监听,当使用 App 时若用户执行截屏操作需要对当前状态进行监听操作,下面有两种方法,其中可以替换截屏的图片内容(Plan A),也可以弹出提示框(Pl ...

  2. 《关于安卓和IOS开发》

    28年前有人发明www microsoft技术开发人员lot 看论文可以看中国知网 微软亚洲研究院 WWDC苹果开发者大会上,苹果都会发布一些新的公司发展出的新的产品的新技术.iOS开发,用到的语言有 ...

  3. jQuery实现购物车计算价格功能的方法

    本文实例讲述了jQuery实现购物车计算价格功能的简易方法,做的比较简单,现分享给大家供大家参考.具体如下: 目的: <%@ page language="java" con ...

  4. c#的传输组件dotnetty

    牛皮不多了,绩效吹起.... 最近一直看大家写的东西,了解的内容不少,我的牛皮也差不多吹完了.... 最后在说说最近测试的dotnetty.去年弄下来试了,不行,最近又弄下来了看看,可以了.哇哈哈哈哈 ...

  5. 【PTA 天梯赛】L3-002 特殊堆栈(二分)

    堆栈是一种经典的后进先出的线性结构,相关的操作主要有“入栈”(在堆栈顶插入一个元素)和“出栈”(将栈顶元素返回并从堆栈中删除).本题要求你实现另一个附加的操作:“取中值”——即返回所有堆栈中元素键值的 ...

  6. CentOS6安装各种大数据软件 第八章:Hive安装和配置

    相关文章链接 CentOS6安装各种大数据软件 第一章:各个软件版本介绍 CentOS6安装各种大数据软件 第二章:Linux各个软件启动命令 CentOS6安装各种大数据软件 第三章:Linux基础 ...

  7. Easy-UI中datebox的默认显示当前日期的最简单的两种方法

    在中有一个Today按钮就是实现显示当前日期,所以我们在src/jquery.datebox.js文件中可以找到currentText:'Today'.所以我们可以使用'currentText'和'T ...

  8. Redis的特性以及优势(附官网)

    NoSQL:一类新出现的数据库(not only sql) 泛指非关系型的数据库 不支持SQL语法 存储结构跟传统关系型数据库中的那种关系表完全不同,nosql中存储的数据都是KV形式 NoSQL的世 ...

  9. python IO模式(多路复用和异步IO深入理解)

    1.事件渠道模型.事件渠道为异步IO的原型. 2.IO模式,一次IO调用会经历两个阶段.一.等待数据阶段,将数据从网络或者是磁盘读取到系统内核(kennel) 二.将数据从内核拷贝到进程中. 基于这两 ...

  10. 回文词 (Palindromes,Uva401)

    例题 3-3 回文词 (Palindromes,Uva401) 输入一个字符中,判断它是否为回文串以及镜像串.输入字符串保证不含数字0.所谓回文串,就是反转以后和原串相同,如abba和madam.所有 ...