《Java数据结构与算法》笔记-CH2有序数组

时间:2022-09-09 09:40:37
/**
* 上个例子是无序数组,并且没有考虑重复元素的情况。
* 下面来设计一个有序数组,我们设定不允许重复,这样提高查找的速度,但是降低了插入操作的速度。
* 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有序数组的更多相关文章

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

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

  2. Java数据结构与算法&lpar;1&rpar; - ch02有序表&lpar;OrderedArray&rpar;

    有序表需要掌握的插入方法,删除方法和二分法查找方法. 插入方法: 从前往后找到比要插入的值大的数组项,将该数组项及之后的项均后移一位(从最后一项起依次后移),最后将要插入的值插入当前数组项. 删除方法 ...

  3. 《java数据结构与算法》系列之&OpenCurlyDoubleQuote;数组&quot&semi;

    int arrayName = new int[10] ;2 int arrayLength = arrayName.length; 解释:java有两种数据类型,一种是基本类型,如int等,一种是引 ...

  4. 【Java数据结构学习笔记之二】Java数据结构与算法之栈&lpar;Stack&rpar;实现

      本篇是java数据结构与算法的第2篇,从本篇开始我们将来了解栈的设计与实现,以下是本篇的相关知识点: 栈的抽象数据类型 顺序栈的设计与实现 链式栈的设计与实现 栈的应用 栈的抽象数据类型   栈是 ...

  5. Java数据结构和算法 - 数组

    Q: 数组的创建? A: Java中有两种数据类型,基本类型和对象类型,在许多编程语言中(甚至面向对象语言C++),数组也是基本类型.但在Java中把数组当做对象来看.因此在创建数组时,必须使用new ...

  6. Java数据结构和算法 - 哈希表

    Q: 如何快速地存取员工的信息? A: 假设现在要写一个程序,存取一个公司的员工记录,这个小公司大约有1000个员工,每个员工记录需要1024个字节的存储空间,因此整个数据库的大小约为1MB.一般的计 ...

  7. Java数据结构和算法(十)——二叉树

    接下来我们将会介绍另外一种数据结构——树.二叉树是树这种数据结构的一员,后面我们还会介绍红黑树,2-3-4树等数据结构.那么为什么要使用树?它有什么优点? 前面我们介绍数组的数据结构,我们知道对于有序 ...

  8. Java数据结构和算法(十四)——堆

    在Java数据结构和算法(五)——队列中我们介绍了优先级队列,优先级队列是一种抽象数据类型(ADT),它提供了删除最大(或最小)关键字值的数据项的方法,插入数据项的方法,优先级队列可以用有序数组来实现 ...

  9. Java数据结构和算法(九)——高级排序

    春晚好看吗?不存在的!!! 在Java数据结构和算法(三)——冒泡.选择.插入排序算法中我们介绍了三种简单的排序算法,它们的时间复杂度大O表示法都是O(N2),如果数据量少,我们还能忍受,但是数据量大 ...

随机推荐

  1. NOIP2008 T3 传纸条 解题报告——S&period;B&period;S&period;

    题目描述 小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题.一次素质拓展活动中,班上同学安排做成一个m行n列的矩阵,而小渊和小轩被安排在矩阵对角线的两端,因此,他们就无法直接交谈了.幸运的是 ...

  2. FastDFS分布式文件系统安装与使用(单节点)

    http://blog.csdn.net/xyang81/article/details/52837974 http://download.csdn.net/detail/xyang81/966749 ...

  3. MathType需要安装一个较新版本的MT Extra&lpar;True type&rpar;字体&lbrack;转&rsqb;

    MathType 6.0中MT Extra(TrueType)字体问题在打开MathType6.0时,有时会提示MathType需要安装一个较新版本的MT Extra(TrueType)字体,这是因为 ...

  4. mysql 时间戳与日期格式的相互转换

    1.UNIX时间戳转换为日期用函数: FROM_UNIXTIME() ); 输出:2006-08-22 12:11:10 2.日期转换为UNIX时间戳用函数: UNIX_TIMESTAMP() Sel ...

  5. Python网络01 原始Python服务器

    原文:Python网络01 原始Python服务器 作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 之前我的Python教程中有人 ...

  6. Erlang运行中的错误

    Erlang运行时发生错误时,会返回一些错误信息,理解这些信息,对于学好.用好Erlang来说是必要. Erlang中的运行错误包括:badarg, badarith, badmatch, funct ...

  7. 转:iOS 屏幕适配,autoResizing autoLayout和sizeClass图文详解

    1. autoResizing autoresizing是苹果早期的ui布局适配的解决办法,iOS6之前完全可以胜任了,因为苹果手机只有3.5寸的屏幕,在加上手机app很少支持横屏,所以iOS开发者基 ...

  8. iOS 错误 之 http请求

     Application Transport Security has blocked a cleartext HTTP (http://) resource load since it is ins ...

  9. Netty 中 LengthFieldBasedFrameDecoder 构造函数取值备忘

    public LengthFieldBasedFrameDecoder(ByteOrder byteOrder, int maxFrameLength, int lengthFieldOffset, ...

  10. 深入剖析虚拟DOM提升性能(Vue,React);

    I.原始渲染方式(直接操作DOM): 1.state数据: 2.JSX模板: 3.数据 + 模板 相结合,生成真实的DOM来显示: 4.state发生改变: 5.数据 + 模板结合,生成真实的DOM来 ...