有序线性表
package list;
public interface SortedList {
void insert(Object obj);
Object delete(Object obj);
int check(Object obj);
}
package list;
/**
* 有序表,元素是以大小或其它的顺序进行排序的。
* 默认是从小到大进行排序的。
*/
public class SequenceSortedList extends SequenceList implements SortedList {
public SequenceSortedList() {
super();
}
public SequenceSortedList(int n) {
super(n);
}
/**
* 把一个已经存在的SequenceList的值插入到有序表中。
*
* @param list
*/
public SequenceSortedList(SequenceList list) {
super(list.size());
for (int i = 1; i <= list.size(); i++) this.insert(list.value(i));
}
/**
* 向有序表中插入元素,待插入的元素应该从第一个元开始比较
* 如果插入的元素比这个元素大,则插入到这个位置;
* 否则继续比较。
* 这个算法的时间复杂度:比较了i次,如果是插入到i的位置,后边的n-i+1个元素要移动(位置为i的元素也要移动)。
* 所以总的时间复杂度为O(n+1)次,n为有序表的元素个数。
*
* @param obj
*/
@Override
public void insert(Object obj) {
Comparable x = (Comparable) obj;
int i;
for (i = 1; i <= this.size(); i++) {
if (x.compareTo(this.value(i)) < 0) break;
}
this.add(obj,i);
}
/**
* 描述:删除list中与给定值相同的值,并返回。
* 遍历list,如果元素比obj大,则返回null,表示删除失败。
* 如果元素与obj相同,则调用remove方法删除元素,并返回删除的元素。
* 如果所有的元素都比obj小,则返回null,表示删除失败。
*
* @param obj
* @return
*/
@Override
public Object delete(Object obj) {
Comparable x = (Comparable) obj;
for (int i = 0; i < this.size(); i++) {
if (x.compareTo(this.value(i)) < 0) return null;
if (x.compareTo(this.value(i)) == 0) return this.remove(i);
}
return null;
}
/**
* 对于有序的list的可以进行二分查找
* 二分查找的时间复杂度为O(log2底n)
* 二分查找后边再写
*
* @param obj
* @return
*/
@Override
public int check(Object obj) {
Comparable x = (Comparable) obj;
for (int i = 1; i <= this.size(); i++) {
Comparable y = (Comparable) this.value(i);
if (x.compareTo(y) < 0) return -1;
if (x.compareTo(y) == 0) return i;
}
return -1;
}
}
package listTest;
import list.SequenceList;
import list.SequenceSortedList;
public class SortedSequenceListTest {
public static void main(String[] args) {
SequenceList sequenceList = new SequenceList();
sequenceList.add(12,1);
sequenceList.add(3,2);
sequenceList.add(45,3);
System.out.println(sequenceList);
SequenceSortedList list = new SequenceSortedList(sequenceList);
System.out.println(list);
list.remove(2);
System.out.println(list);
System.out.println(list.check(45));
}
}