《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),如果数据量少,我们还能忍受,但是数据量大 ...
随机推荐
- UVa 11922 - Permutation Transformer 伸展树
第一棵伸展树,各种调试模板……TVT 对于 1 n 这种查询我处理的不太好,之前序列前后没有添加冗余节点,一直Runtime Error. 后来加上冗余节点之后又出了别的状况,因为多了 0 和 n+1 ...
- LA 6187 - Never Wait for Weights 并查集的带权路径压缩
只有一个地方需要注意: 设节点a的根为u,b的跟为v,则:a = u + d[a]; b = v + d[b]; 已知:b-a=w.所以v - u = d[a] - d[b] + w; 在合并两个集 ...
- android自动更新软件版本
根据网上的然后小改 import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import j ...
- iOSbase64
ios中使用BASE64进行加密和解密的方法也很简单,可以直接用google-toolbox-for-mac的GTMBase64.h来实现google-toolbox-for-mac的对应地址如下: ...
- tlProPlayer for windows
tlProPlayer tlProPlayer简介 tlProPlayer是一款定位高性能产品,支持透传,原生输出,并支持硬解码(硬件加速)的多媒体产品,兼容tlplayer所有特性.支持视频加密播放 ...
- AutoResetEvent
private static readonly AutoResetEvent autoResetEvent = new AutoResetEvent(false); private static vo ...
- [POJ2398]Toy Storage(计算几何,二分,判断点在线段的哪一侧)
题目链接:http://poj.org/problem?id=2398 思路RT,和POJ2318一样,就是需要排序,输出也不一样.手工画一下就明白了.注意叉乘的时候a×b是判断a在b的顺时针还是逆时 ...
- Effective C++学习笔记 条款06:如不想使用编译器自动生成的函数,就该明确拒绝
一.为驳回编译器自动提供的机能,可将相应成员函数声明为private并且不予实现.(如果你仅仅是自己不实现的话,编译器会帮你实现) 如: class A { public: A(const strin ...
- hdu 4901 The Romantic Hero (dp)
题目链接 题意:给一个数组a,从中选择一些元素,构成两个数组s, t,使s数组里的所有元素异或 等于 t数组里的所有元素 位于,求有多少种构成方式.要求s数组里 的所有的元素的下标 小于 t数组里的所 ...
- zoj 3785 What day is that day? (打表找规律)
题目 思路:比赛的时候有想过找循环节,但是,打表打错了. 后来,看着过了挺多人,就急了, 看了一下别人的时间 耗时都挺长的,就以为不是找规律, 没想到真是找规律,不过,这个题的数据可能挺大的. AC代 ...