顺序表

32 篇文章 0 订阅

        顺序表其实就是我们所熟悉的数组,擅长随机访问,给定位置能够高效的获取/修改指定位置的值,时间复杂度为O(1),但按值查找、插入、删除等时间复杂度均为O(n)。对于尾插和尾删,时间复杂度为O(1)。

SeqList的实现:

package SeqList;

public class SeqList {
	//数组最大容量为10,但这10个元素不一定都是有效元素
	private int[] data = new int[10];
	//表示数组当前有效元素个数
	private int size = 0;
	//打印
	public void display() {
		System.out.print("[");
		for(int i=0;i<size;i++) {
			System.out.print(data[i]);
			if(i != size-1) {
				System.out.print(",");
			}
		}
		System.out.println("]");
	}
	//增加元素
	//pos为放在哪个下标,elem为插入哪个元素
	public void add(int pos,int elem) {
		//pos无效
		if(pos < 0 || pos > size) {
			return;
		}
		if(this.size >= this.data.length) {
			//容量不够,需扩容
			//申请一块更大的内存,再把原有数据拷贝过去
			realloc();
		}
		//pos == size 相当于尾插
		if(pos == size) {
			this.data[pos] = elem;
			this.size++;
			return;
		}
		//在中间位置插入,要进行搬运
		for(int i = this.size; i > pos; i--) {
			this.data[i]=this.data[i-1];
		}
		this.data[pos] = elem;
		this.size++;
	}
	//扩容
	private void realloc() {
		//根据实际场景来选择是线性增长还是指数增长,亦或其它方式
		//扩容是比较大的开销
		int[] newData = new int[this.data.length*2];
		for(int i=0; i<this.data.length;i++) {
			newData[i]=this.data[i];
		}
		this.data = newData;
	}
	//判断元素是否存在
	public boolean contains(int toFind) {
		for(int i=0;i<this.size;i++) {
			if(this.data[i] == toFind) {
				return true;
			}
		}
		return false;
	}
	//查找元素
	public int search(int toFind) {
		for(int i=0;i<this.size;i++) {
			if(this.data[i] == toFind) {
				return i;
			}
		}
		return -1;
	}
	//获取pos位置
	public int getPos(int pos) {
		return this.data[pos];
	}
	public void setPos(int pos,int elem) {
		this.data[pos] = elem;
	}
	//删除第一次出现的值为key的元素
	public void remove(int toRemove) {
		int pos = search(toRemove);
		if(pos == -1) {
			//该值不存在,不必删除
			return;
		}
		if(pos == this.size-1) {
			//如果是最后一个元素,直接size--
			this.size--;
			return;
		}
		//普通位置的删除,也需搬运
		for (int i = pos; i < size-1; i++) {
			this.data[i] = this.data[i+1];
		}
		this.size--;
	}
	//求长度
	public int size() {
		return size;
	}
	//清空
	public void clear() {
		this.size = 0;
		//缩容
		this.data = new int[10];
	}
}

Test测试类:

package SeqList;

public class Test {
	public static void main(String[] args) {
		TestAdd();
		TestContians();
		TestSearch();
		TestRemove();
	}
	public static void TestAdd() {
		System.out.println("测试添加:");
		SeqList seqList = new SeqList();
		seqList.add(0, 1);
		seqList.add(1, 2);
		seqList.add(2, 3);
		seqList.add(3, 4);
		seqList.add(2, 5);
		seqList.display();
	}
	public static void TestContians() {
		System.out.println("测试contians方法:");
		SeqList seqList = new SeqList();
		seqList.add(0, 1);
		seqList.add(1, 2);
		seqList.add(2, 3);
		seqList.add(3, 4);
		boolean ret = seqList.contains(2);
		System.out.println("ret预期是true,实际是:"+ret);
	}
	public static void TestSearch() {
		System.out.println("测试search方法:");
		SeqList seqList = new SeqList();
		seqList.add(0, 1);
		seqList.add(1, 2);
		seqList.add(2, 3);
		seqList.add(3, 4);
		int ret = seqList.search(3);
		System.out.println("ret预期是2,实际是:"+ret);
	}
	public static void TestRemove() {
		System.out.println("测试remove方法:");
		SeqList seqList = new SeqList();
		seqList.add(0, 1);
		seqList.add(1, 2);
		seqList.add(2, 3);
		seqList.add(3, 4);
		seqList.remove(3);
		System.out.print("预期是:[1,2,4],实际是:");
		seqList.display();
	}
}

运行结果:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值