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

 

一、数据结构描述:

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();

    }

}

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值