顺序表特点:
①顺序表中元素依次存放在连续的存储空间中。
②可以快速的读取顺序表中的任意位置的元素。
③插入或者删除元素时,经常要移动大量元素,效率低。
④必须事先确定一块连续的存储空间,在声明后大小不变,是静态的,可能会导致存储空间的浪费。
package list;
import java.lang.reflect.Array;
import java.lang.*;
/*
* 顺序表定义
* */
public class ListArray<T extends Comparable> {
private int length; //最大的容量
private int size; //当前容量
private T[] elements; //数据数组
private Class clazz; //T的Class对象
public ListArray(Class z,int length){
this.length=length;
this.size=0;
this.elements = (T[])Array.newInstance(z,length);
this.clazz=z;
}
public int getSize(){
return this.size;
}
public boolean isEmpty(){
return size==0;
}
public T get(int i){
if(i<0||i>size-1)
return null;
return elements[i];
}
//插入元素
public boolean insert(int i,T e){
//非法位置插入,插入失败
if(i<0||size>=length)
return false;
//最大长度不足,扩展
if(size==length)
expandSpace();
//若插入位置比当前表的大小大,则把元素插到尾部.
if(i>size-1){
elements[size]=e;
size++;
return true;
}
//若在中间,则先将要插入的位置空出来,然后再插入
for(int j=size-1;j>=i;j--){
elements[j+1]=elements[j];
}
elements[i]=e;
size++;
return true;
}
//打印数组
public void print(){
if(size==0)
System.out.println("size:0");
for(int i=0;i<size;i++)
System.out.println(i+":"+elements[i]);
}
//扩展数组最大长度为原来的2倍
public void expandSpace(){
T[] a = (T[])Array.newInstance(clazz,elements.length);
for(int i=0;i<elements.length;i++)
a[i]=elements[i];
elements = a;
}
//删除位置为i的元素
public boolean remove(int i){
if(i<0||i>size)
return false;
for(int j=i+1;j<=size-1;j++){
elements[j-1]=elements[j];
System.out.print("["+j+"]");
}
size--;
return true;
}
//查找元素为e的位置
public int search(T e){
for(int i=0;i<size;i++)
if(elements[i]==e)
return i;
return -1;
}
//两个非递减有序序列合并
public ListArray<T> merge(ListArray<T> other){
int i=0,j=0,k=0;
ListArray<T> mergedList = new ListArray<>(clazz,this.length+other.getSize());
while(i<this.getSize()&&j<other.getSize()){
if(this.get(i).compareTo(other.get(j))<0){
mergedList.elements[k++]=this.elements[i];
i++;
}
else{
mergedList.elements[k++]=other.get(j);
j++;
}
}
if(i<this.size)
while(i<this.size){
mergedList.elements[k++]=this.elements[i];
i++;
}
else
while(j<other.getSize()){
mergedList.elements[k++]=other.elements[i];
j++;
}
mergedList.size=k;
return mergedList;
}
public static void main(String[] args) {
ListArray<Integer> list = new ListArray<>(Integer.class,15);
list.insert(0,2);
list.insert(1,4);
list.insert(2,4);
list.insert(3,6);
list.insert(4,7);
ListArray<Integer> other = new ListArray<>(Integer.class,15);
other.insert(0,1);
other.insert(1,3);
other.insert(2,3);
other.insert(3,4);
other.insert(4,7);
//list.remove(2);
ListArray<Integer> merged = list.merge(other);
merged.print();
System.out.println("---");
System.out.println("Search 2:"+list.search(2));
}
}
0:1
1:2
2:3
3:3
4:4
5:4
6:4
7:6
8:7
9:7
---
Search 2:0