《Java数据结构与算法》笔记-CH2有序数组
/**
* 上个例子是无序数组,并且没有考虑重复元素的情况。
* 下面来设计一个有序数组,我们设定不允许重复,这样提高查找的速度,但是降低了插入操作的速度。
* 1.线性查找
* 2.二分查找
* 有序数组优点:查找比无序数组快
* 缺点:插入操作由于所有靠后的数据都需要移动来腾开空间,所以插入比较慢
* 有序数组和无序数组删除操作都很慢,因为数据项必须向前移动来填补已删除的数据项的洞。
* 有序数组在查找频繁的情况下很有用,但若是插入和删除较为频繁,则无法高效工作。
*/
class OrderArray {
private long[] array;
private int nElement; public OrderArray(int size) {
this.array = new long[size];
this.nElement = 0;
} public String toString() {
if (nElement == 0)
return "[]";
StringBuilder sb = new StringBuilder();
sb.append("[");
for (int i = 0; i < nElement; i++) {
sb.append(array[i] + ",");
}
sb.deleteCharAt(sb.length() - 1);
sb.append("]");
return sb.toString();
} public void display() {
System.out.println(toString());
} public void insert(long value) {
// 如果array满了,就不插入,直接返回
if (nElement == array.length) {
System.out.println("数组已满,插入停止...");
return;
}
// 如果没有满则进行插入操作
// 找到插入位置
int j;
for (j = 0; j < nElement; j++) {
if (array[j] == value) {// 插入值在数组中已存在,停止
System.out.println("重复了,插入停止...");
return;
} else if (array[j] > value) {// 找到位置
break;
}
}
// 从最后一个元素到该位置的元素,依次向后挪动一个位置
for (int k = nElement; k > j; k--) {
array[k] = array[k - 1];
}
// 把value放入该位置
array[j] = value;
// eElement加一
nElement++;
}
/**
* 线性查找
* @param value
* @return
*/
public int findValueByIte(long value) {
for (int i = 0; i < size(); i++) {
if (array[i] == value)
return i;
}
return -1;
}
/**
* 二分法查找
* @param value
* @return
*/
public int findValueByBi(long value) {
int lower = 0;
int upper = nElement - 1;
int curr;
while (true) {
curr = (lower + upper) / 2;
if (array[curr] == value)
return curr;
else if (lower > upper)
return -1;
else {
if (array[curr] < value)
lower = curr + 1;
else
upper = curr - 1;
}
}
} public boolean delete(long value) {
int index = findValueByBi(value);
//value不在数组中
if(index == -1){
System.out.println(value+"不在数组中,退出");
return false;
}
//value所在位置为index
//从该位置开始到倒数第二个位置,将后继元素向前移动一个位置,然后数组个数-1
for(int k=index;k<nElement-1;k++)
array[k] = array[k+1];
nElement --;
return true;
} public int size() {
return nElement;
}
} public class ArrayDemo2 {
public static void main(String[] args) {
OrderArray oa = new OrderArray(10);
long[] arr = { 3, 2, 54, 32, 3, 66, 7, 455, 678, 33, 21, 26, 1, 98, 7 };
for (int i = 0; i < arr.length; i++) {
oa.insert(arr[i]);
oa.display();
}
System.out.println(oa.findValueByIte(668));
System.out.println(oa.findValueByBi(678));
System.out.println(oa.delete(668));
oa.display();
System.out.println(oa.delete(455));
oa.display();
System.out.println(oa.delete(2));
oa.display();
System.out.println(oa.delete(678));
oa.display();
oa.delete(3);
oa.delete(7);
oa.delete(32);
oa.display();
oa.delete(54);
oa.delete(33);
oa.delete(32);
oa.delete(21);
oa.display();
oa.delete(66);
oa.display();
oa.delete(7);
}
}
《Java数据结构与算法》笔记-CH2有序数组的更多相关文章
- Java数据结构和算法(二)——数组
上篇博客我们简单介绍了数据结构和算法的概念,对此模糊很正常,后面会慢慢通过具体的实例来介绍.本篇博客我们介绍数据结构的鼻祖——数组,可以说数组几乎能表示一切的数据结构,在每一门编程语言中,数组都是重要 ...
- Java数据结构与算法(1) - ch02有序表(OrderedArray)
有序表需要掌握的插入方法,删除方法和二分法查找方法. 插入方法: 从前往后找到比要插入的值大的数组项,将该数组项及之后的项均后移一位(从最后一项起依次后移),最后将要插入的值插入当前数组项. 删除方法 ...
- 《java数据结构与算法》系列之“数组"
int arrayName = new int[10] ;2 int arrayLength = arrayName.length; 解释:java有两种数据类型,一种是基本类型,如int等,一种是引 ...
- 【Java数据结构学习笔记之二】Java数据结构与算法之栈(Stack)实现
本篇是java数据结构与算法的第2篇,从本篇开始我们将来了解栈的设计与实现,以下是本篇的相关知识点: 栈的抽象数据类型 顺序栈的设计与实现 链式栈的设计与实现 栈的应用 栈的抽象数据类型 栈是 ...
- Java数据结构和算法 - 数组
Q: 数组的创建? A: Java中有两种数据类型,基本类型和对象类型,在许多编程语言中(甚至面向对象语言C++),数组也是基本类型.但在Java中把数组当做对象来看.因此在创建数组时,必须使用new ...
- Java数据结构和算法 - 哈希表
Q: 如何快速地存取员工的信息? A: 假设现在要写一个程序,存取一个公司的员工记录,这个小公司大约有1000个员工,每个员工记录需要1024个字节的存储空间,因此整个数据库的大小约为1MB.一般的计 ...
- Java数据结构和算法(十)——二叉树
接下来我们将会介绍另外一种数据结构——树.二叉树是树这种数据结构的一员,后面我们还会介绍红黑树,2-3-4树等数据结构.那么为什么要使用树?它有什么优点? 前面我们介绍数组的数据结构,我们知道对于有序 ...
- Java数据结构和算法(十四)——堆
在Java数据结构和算法(五)——队列中我们介绍了优先级队列,优先级队列是一种抽象数据类型(ADT),它提供了删除最大(或最小)关键字值的数据项的方法,插入数据项的方法,优先级队列可以用有序数组来实现 ...
- Java数据结构和算法(九)——高级排序
春晚好看吗?不存在的!!! 在Java数据结构和算法(三)——冒泡.选择.插入排序算法中我们介绍了三种简单的排序算法,它们的时间复杂度大O表示法都是O(N2),如果数据量少,我们还能忍受,但是数据量大 ...
随机推荐
- BeanFactory 和 ApplicationContext
Spring通过一个配置文件描述Bean及Bean直接的依赖关系,利用Java语言的反射功能实例化Bean并建立Bean之间的依赖关系.Sprig的IoC容器在完成这些底层工作的基础上,还提供了Bea ...
- LA 6047 Perfect Matching 字符串哈希
一开始我用的Trie+计数,但是不是计多了就是计少了,后来暴力暴过去的…… 看了别人的代码知道是字符串哈希,但是仍有几个地方不理解: 1.26^500溢出问题 2.没考虑哈希碰撞? 跪求指点! #in ...
- php命令行用法简介
Php是一个非常流行的web服务端脚本语言.其实,php不仅仅可以在web服务器中充当重要角色.在命令行一样可以执行. 本文中,笔者为各位介绍下php在命令行中的使用方法. 1. 查看php的版本. ...
- 使用eclipse的快捷键自动生成的map或者reduce函数的参数中:“org.apache.hadoop.mapreduce.Reducer.Context context”
今天在测试mapreduce的程序时,就是简单的去重,对照课本上的程序和自己的程序,唯一不同的就是“org.apache.hadoop.mapreduce.Reducer.Context contex ...
- 真正解决ASP.NET每一个页面首次访问超级慢的问题 (转载)
原文:http://www.afuhao.com/article_articleId-219.shtml 摘要:ASP.NET页面首次打开很慢,但别的页面如果没有访问过,去访问也会慢.你也许认为它是在 ...
- LA 3516 (计数 DP) Exploring Pyramids
设d(i, j)为连续子序列[i, j]构成数的个数,因为遍历从根节点出发最终要回溯到根节点,所以边界情况是:d(i, i) = 1; 如果s[i] != s[j], d(i, j) = 0 假设第一 ...
- unison + inotify 实现文件实时双向同步部署步骤
unison + inotify 实现文件实时双向同步部署步骤 一. Unison简介 Unison是Windows.Linux以及其他Unix平台下都可以使用的文件同步工具,它能使两个文件夹(本地或 ...
- UVA 11396 Claw Decomposition(二分图)
以“爪”形为单元,问所给出的无向图中能否被完全分割成一个个单元. 分析图的性质,由于已知每个点的度是3,所以“爪”之间是相互交错的,即把一个“爪”分为中心点和边缘点,中心点被完全占据,而边缘点被三个“ ...
- 纯css3写的仿真图书翻页效果
对css3研究越深入,越觉得惊艳.css3说不上是万能的,但是它能实现的效果也超出了我的想象.它的高效率和动画效果的流畅性很多情况下能替代js的作用.个人习惯css3能实现的效果就不会用js,虽然在国 ...
- FU-A分包方式,以及从RTP包里面得到H.264数据和AAC数据的方法。。
[原创] RFC3984是H.264的baseline码流在RTP方式下传输的规范,这里只讨论FU-A分包方式,以及从RTP包里面得到H.264数据和AAC数据的方法. 1.单个NAL包单元 12字节 ...