/**
* 上个例子是无序数组,并且没有考虑重复元素的情况。
* 下面来设计一个有序数组,我们设定不允许重复,这样提高查找的速度,但是降低了插入操作的速度。
* 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数据结构与算法(1) - ch02有序表(OrderedArray)

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

  3. 《java数据结构与算法》系列之“数组"

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

  4. 【Java数据结构学习笔记之二】Java数据结构与算法之栈(Stack)实现

      本篇是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. Servlet小示例:jsp页面提交信息Servlet接收并打印输出

    该示例采用doPost方法提交表单,该示例一共包含两个文件. 一个是用来提交用户信息的表单userForm2.jsp,另一个是用来接收参数的Servlet. userForm2.jsp <%@ ...

  2. SQL Server查询优化方法(查询速度慢的原因很多,常见如下几种) .

    今天看到一位博友的文章,觉得不错,转载一下,希望对大家有帮助,更多文章,请访问:http://blog.haoitsoft.com 1.没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺 ...

  3. linux下拷贝整个目录

    该命令的功能是将给出的文件或目录拷贝到另一文件或目录中,就如同DOS下的copy命令一样,功能非常强大. 语法:cp [选项] 源文件或目录 目标文件或目录 说明:该命令把指定的源文件复制到目标文件或 ...

  4. iOSTab bar

    http://www.apkbus.com/android-130504-1-1.html #import #import "FirstViewController.h"#impo ...

  5. NLP基本任务-nltk_data文本分割

    将文本分割为句子 nltk.sent_tokenize(text,language) text:需要分割的文本 language:语言种类 czech捷克语 danish丹麦语 dutch荷兰语 en ...

  6. php整理(三): 面向对象

    PHP学习(三)----面向对象   首先,还是建立一个好的理解模型: 1.什么是面向对象? 面向对象分为两个部分,那就是:什么是对象和什么是面向? 什么是对象: 对象的出现就是为了用代码更好的绘制我 ...

  7. Android开发之onActivityResult()中的resultCode为0,intent为null的解决办法

    BUG:昨天在使用activity之间传值的时候,遇到了一个bug,该bug为:Activity A启动Activity B,然后在Activity B中取到一个值,并通过back键返回到Activi ...

  8. [LeetCode#247] Strobogrammatic Number II

    Problem: A strobogrammatic number is a number that looks the same when rotated 180 degrees (looked a ...

  9. poj 1177 Picture (线段树 扫描线 离散化 矩形周长并)

    题目链接 题意:给出n个矩形,每个矩形给左下 和 右上的坐标,求围成的周长的长度. 分析: 首先感谢大神的博客,最近做题经常看大神的博客:http://www.cnblogs.com/kuangbin ...

  10. bzoj2351 2462

    我没写hash,写了一些奇怪的做法,好像被hash随便操了…… 如果没有多测,那么这道题是白书上的例题 把询问矩阵当作a个模板串,建成一个ac自动机 把一开始的矩阵当作n个串放到自动机上匹配,找到a个 ...