顺序表
顺序表在计算机内存中以数组的形式进行保存
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)
- 由于顺序表的底层是数组实现的,数组的长度是固定的,所以在顺序表的过程中涉及到了容器的扩容问题,这样会导致顺序表的时间复杂度并不是线性关系,如果顺序表在某个结点处涉及到了扩容,耗时也将增多

浙公网安备 33010602011771号