数据结构-顺序排序表(JAVA)

顺序排序表只是继承了顺序表,改变了里面一些内容。另外可以把search函数做一下优化,改为二分查找。

https://blog.csdn.net/king8611/article/details/81065297

这是昨天写的顺序表,顺序排序表就是继承这个,其中需要重载的函数有insert相关的函数,set函数变为不可用函数。然后可以把search函数优化一下。

public class SortedSeqList<T extends Comparable<?super T>> extends SeqList<T>{
	public SortedSeqList(){
	super();
	}
	public SortedSeqList(int length){
	super(length);
	}
	public SortedSeqList(T values[]){
	super(values.length);
	for(int i=0;i<values.length;i++)
		this.insert(values[i]);
	}
	public int insert(T x){													//循序表的插入函数
		Object obj[]=element;
		if(this.size()==element.length){		//如果数组已满,扩充数组。
			element=new Object[2*this.size()];
			for(int i=0;i<size();i++){
				element[i]=obj[i];
			}
		}
		int i=0;	
		if(this.isEmpty()||x.compareTo(this.get(this.size()-1))>0)			//如果这个表是空的或者插入的数大于最后一个数,那就直接插入最后
			i=this.n;
		else while(i<this.n&&x.compareTo(this.get(i))>0)
			i++;
		super.insert(i,x);
		return i;
	}
	public int insertDifferent(T x) {										//查询插入,若表中不存在这个数时,插入这个数
		int i=search(x);
		if(i==-1){insert(x);}
		return i;
	}
	public int search(T key) {												//查询函数,因为是顺序表,所以可以利用二分查找
		int lb=-1,ub=this.size();
		while(ub-lb>1){
			int mid=(lb+ub)/2;
			if(super.get(mid).compareTo(key)>=0)ub=mid;
			else lb=mid;
		}
		if(!super.get(ub).equals(key))ub=-1;
		return ub;
	}
	public int remove(T key){
		int i=search(key);
		super.remove(i);
		return i;
	}
	public void addAll(SeqList<? extends T> list) {	
		if(list==null)throw new NullPointerException("x==null");
		for(int i=0;i<list.size();i++){
			insert(list.get(i));
		}
	}
	//--------这两个方法顺序表不支持------------//
	public void set(int i, T x) {
		throw new UnsupportedOperationException("set(int i,T x)");
	}
	public int insert(int i, T x) {
		throw new UnsupportedOperationException("insert(int i,T x)");
	}
}

然后是测试类:

public class SortedSeqListTest {

	public static void main(String[] args) {
		List<Integer> list=new SortedSeqList<Integer>();
		for(int i=20;i>=0;i-=2)list.insert(i);				//插入一批数
		System.out.println(list.toString());				//打印一下
		System.out.println(list.search(5));					//寻找函数
		System.out.println(list.search(6));
		list.remove(new Integer(6));
		System.out.println(list.toString());
		List<Integer> list2=new SeqList<Integer>();
		for(int i=15;i>1;i--)list2.insert(i);
		System.out.println(list2);
		
		list.addAll(list2);									//addAll函数
		System.out.println(list.toString());
	}
}

测试结果:

线性表.SortedSeqList(0,2,4,6,8,10,12,14,16,18,20)
-1
3
线性表.SortedSeqList(0,2,4,8,10,12,14,16,18,20)
线性表.SeqList(15,14,13,12,11,10,9,8,7,6,5,4,3,2)
线性表.SortedSeqList(0,2,2,3,4,4,5,6,7,8,8,9,10,10,11,12,12,13,14,14,15,16,18,20)

如果有什么错误欢迎大佬们纠正哦(。・∀・)ノ

猜你喜欢

转载自blog.csdn.net/king8611/article/details/81084027