(一)线性数组的数据结构和算法

本文详细介绍了数组的基本操作,包括插入、删除及查找等,并通过Java语言实现了这些操作。文章指出数组的插入操作相对简单且高效,但删除和查找操作则较为复杂,效率较低。

一、数据结构描述:

1. 插入操作:对于一般数组(不包括有序数组)而言,插入一个元素,即在数组的最后面添加一项。当然,我们这里讨论的并不全面,因为一个数组的长度定义以后就不能再改变。所以,在添加数据项时,还要保证没有超过数组的长度限制。一旦超过了数组容量,就会报错ArrayIndexOutOfBoundsException。所以,对于长度固定的数组而言,并不适用于实际应用中的所有地方。

2. 删除操作:数组元素的删除可能并不像你想象的那么简单,其实它的执行效率比较低。每删除一个元素,就可能需要移动若干的元素,来填补删除的空洞。举例说明:数组中存放有10个元素,如果删除第4个元素,那么从第5个到第10个元素需要依次向前移动一位(即移动了6个元素的位置)。

3. 查找操作:对于一般数组,查找的效率并不是很高,需要从头到尾进行遍历,直到找到需要的元素。但是,对于一种特殊的数组——有序数组而言,采用我们后面即将提到的二分法查找,效率将非常的高。

二、效率的比较:

由上面的描述可以看出,对于一般数组的插入操作,消耗时间用大O表示法为:O1),即消耗常数的时间。而删除操作和查找操作消耗的时间为ON)。可见,对于一般数组的删除和查找还有很多可以改进的空间。

三、Java语言描述算法

package com.solid.array;

/**

* 数据结构和算法(Java描述)——线性数组的数据结构和算法

*/

public class HighArray {

//数组对象

private long[] arr;

//数组元素个数

private static int nElems;

/**

* 构造函数

* @param max

*/

public HighArray(int max) {

arr = new long[max];

nElems = 0;

}

/**

* 向数组中插入某个元素

* @param value

*/

public void insert(long value) {

arr[nElems] = value;

nElems++;

}

/**

* 查找数组中的某个元素(这里假设元素个数没有重复)

* @param value

*/

public void find(long value) {

int i;

for(i=0; i<nElems; i++) {

if(arr[i] == value) {

break;

}

}

if(i == nElems) {

System.out.print("can't find: " + value);

} else {

System.out.println("find it!");

}

}

/**

* 删除数组中的某个元素(这里假设元素个数没有重复)

* @param value

* @return

*/

public boolean delete(long value) {

int i;

for(i=0; i<nElems; i++) {

if(value == arr[i]) {

break;

}

}

if(i == nElems) {

return false;

} else {

for(int j=i; j<nElems; j++) {

arr[j] = arr[j+1];

nElems--;

}

return true;

}

}

/**

* 显示数组中的所有元素

*/

public void display() {

for(int i=0; i<nElems; i++) {

System.out.print("arr["+i+"]=" + arr[i] + " ");

}

System.out.println();

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值