順序表使用一段物理地址連續的存儲單元依次存儲數據元素的線性結構 一般情況下采用數組存儲 在數組上完成數據的贈三改查
順序表一般可以分爲:
靜態順序表,使用定長數組存儲
動態順序表,使用動態開闢的數組存儲
順序表就是我們熟悉的數組 擅長隨機訪問 給定位置 能夠高效的獲取、修改指定位置的值
時間複雜度是O(1)
順序表按值查找 插入 刪除 時間複雜度是O (N)
對於尾插和尾刪 時間複雜度是O(1)
public class Test {
public static void main(String[] args) {
TestAdd();
TestContains();
TestSearch();
TestRemove();
}
public static void TestAdd() {
System.out.println("測試add");
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 TestContains() {
System.out.println("測試contains");
SeqList seqlist = new SeqList();
seqlist.add(0,1);
seqlist.add(1,2);
seqlist.add(2,3);
seqlist.add(3,4);
seqlist.add(2,5);
boolean result = seqlist.contains(5);
System.out.println("result 預期是 true 實際是 " + result);
}
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);
seqlist.add(2,5);
int result = seqlist.search(5);
System.out.println("result 預期是 2 實際是 " + result);
}
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.add(2,5);
seqlist.remove(3);
System.out.println("預期值是:[1,2,5,4]");
System.out.print("實際值是:");
seqlist.display();
}
}
public class SeqList {
private int[] data = new int[10];
private int size = 0;
//打印
public void display() {
//System.out.println(Arrays.toString(data));
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("]");
}
//插入 時間複雜度是O(n)
public void add(int pos,int elem) {
if(pos < 0 || pos > size) {
//位置無效
return;
}
if (this.size >= this.data.length) {
realloc();
}
if(pos == size) {
//尾插的情況 直接把新元素放到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;
}
//獲取某個位置的元素
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-- 即可
//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 this.size;
}
//清空
public void clear() {
this.size = 0;
this.data = new int[10];
}
}