顺序表

顺序表在计算机内存中以数组的形式进行保存

1. 顺序表的API设计

2. 顺序表的代码实现

import java.util.Objects;

public class SequenceList<T> {
    //记录当前数组中元素的个数
    private int N;
    //储存元素的数组
    private T[] eles;
    //构造方法
    public SequenceList(int capacity) {
    this.eles = (T[]) new Object[capacity];
    this.N = 0;
    }
    //将顺序表清空
    public void clear(){
        this.N = 0;
    }
    //判断当前线性表是否为空表
    public boolean isEmpty(){
        return N==0;
    }
    //获取线性表的长度
    public int length(){
        return N;
    }
    //获取指定位置处的元素
    public T get(int i){
        return eles[i];
    }
    //向顺序表中添加元素
    public void insert(T t){
        if (N==eles.length){
            resize(2*eles.length);
        }
        eles[N++] = t;
    }
    //向i索引处插入t元素
    public void insert(int i,T t){
        if (N==eles.length){
            resize(2*eles.length);
        }
        //先把i索引处的元素以及后面的元素一次向后移动一位
        for (int index = N-1;index>=i;index--){
            eles[index] = eles[index-1];
        }
        //再把t元素放到i索引处
        eles[i] = t;
        N++;
    }
    //删除指定位置处的元素,并返回该元素
    public T remove(int i){
        //记录索引i处的值
        T current =  eles[i];
        //将索引i后面的元素一次向前移动一位
        for (int index = i;index<N-1;index++){
            eles[index] = eles[index+1];
        }
        N--;
        if (N<eles.length/4){
            resize(eles.length/2);
        }
        return current;
    }
    //查找t元素第一次出现的位置
    public int indexOf(T t){
        for (int i = 0;i<N;i++){
            if (eles[i].equals(t)){
                return i;
            }
        }
        //-1代表没有找到
        return -1;
    }
    //根据传入的参数,重置elsi的大小
    public void resize(int newSize){
        //定义一个临时数组,指向原数组
        T[] temp = eles;
        //创建新数组
        eles = (T[]) new Objects[newSize];
        //把原数组的数据拷贝到新数组即可
        for (int i = 0;i<N;i++){
            eles[i] = temp[i];
        }
    }
}

3. 顺序表的时间复杂度

  • 当对顺序表进行查询操作时只需要一次操作就可以,所以时间复杂度为O(1)
  • 当对顺序表进行插入操作时,需要把i元素以及后面的元素移动一次,随着数量的增大,移动的元素也将越来越大,时间复杂度为O(n)
  • 当对顺序表进行删除操作时,需要把i元素以及后面的元素移动一次,当数量很大时,移动的元素也将很大,时间复杂度为O(n)
  • 由于顺序表的底层是数组实现的,数组的长度是固定的,所以在顺序表的过程中涉及到了容器的扩容问题,这样会导致顺序表的时间复杂度并不是线性关系,如果顺序表在某个结点处涉及到了扩容,耗时也将增多
posted @ 2020-07-21 16:25  zuzuzu_code  阅读(144)  评论(0)    收藏  举报