/**
* 上个例子是无序数组,并且没有考虑重复元素的情况。
* 下面来设计一个有序数组,我们设定不允许重复,这样提高查找的速度,但是降低了插入操作的速度。
* 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. Android 清除canvas 笔迹代码

    canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR); canvas.drawLine(pointX, , event.getX(), ...

  2. 如何构建你自己的Java库【翻译】

    原文http://www.programcreek.com/2011/07/build-a-java-library-for-yourself/ 原文和翻译都只是参考,如有不对,欢迎指正. 代码复用是 ...

  3. Flex 国际化(flex Localize)

    先说编译到主程序中去的方法: 1.创建资源文件夹 譬如可以在src文件夹下创建Locale文件夹,然后在此文件夹再次创建每个地区的资源文件夹,譬如de_DE,zh_CN. 然后分别创建后缀名为.pro ...

  4. ios中addtarget

    Target-action:目标-动作模式,它贯穿于iOS开发始终.但是对于初学者来说,还是被这种模式搞得一头雾水. 其实Target-action模式很简单,就是当某个事件发生时,调用那个对象中的那 ...

  5. java-基础练习题

    [程序1] 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 1.程序分析: 兔子的规律为数列1,1 ...

  6. Android Handler 避免内存泄漏的用法总结

    Android开发经常会用到handler,但是我们发现每次使用Handler都会出现:This Handler class should be static or leaks might occur ...

  7. hdu 4864 Task (贪心 技巧)

    题目链接 一道很有技巧的贪心题目. 题意:有n个机器,m个任务.每个机器至多能完成一个任务.对于每个机器,有一个最大运行时间xi和等级yi, 对于每个任务,也有一个运行时间xj和等级yj.只有当xi& ...

  8. ArrayList和List之间的转换

    开发中不免碰到List与数组类型之间的相互转换,举一个简单的例子: package test.test1; import java.util.ArrayList; import java.util.L ...

  9. 好用的工具之一 ---- Sublime Text

    官网地址和详细解释:http://www.sublimetext.com/ 异次元的一些更详细的个人体验细节:http://www.iplaysoft.com/sublimetext.html

  10. [反汇编练习] 160个CrackMe之002

    [反汇编练习] 160个CrackMe之002. 本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注 ...