标签:
首先写一个数组类(这个是按照从小到大排列的数组)。插入操作:遍历整个数组,当找到该数据比要插入的数据后就跳出循环,然后从最后一个数据向前遍历,直到遍历到刚刚找到的那个数据项为止,每个数据往后移动一位,最后就往找到的那个位置插入该数值。删除操作:遍历数组,找到要删除的数据项,删除。查找操作:用二分查找法,每次都找到数据中间的一项,如果该项比要查找的数据大,那么把后一般的数据去掉,保留前一半的数据,然后再找前一半数据的中间项,重复这个方法直到找到为止。
public class OrderArray {
private long[] a;
private int nElement;
public OrderArray(int max){
a = new long[max];
nElement = 0;//注意这里不是max,因为一开始数组里面是没有实际数据的
}
public void insert(long value){
int i;
for(i = 0; i < nElement; i++){
if(a[i]>value)break;
}
for(int k = nElement; k > i; k--){
a[k] = a[k-1];
}
a[i] = value;
nElement++;
}
public int size(){
return nElement;
}
public void show(){
for(int i = 0; i <nElement; i++){
System.out.print(a[i]+" ");
}
System.out.println();
}
public int find(long searchKey){
int minindex = 0;
int maxindex = nElement-1;
int middleindex;
while(true){
middleindex = (minindex+maxindex)/2;
if(a[middleindex] == searchKey){
return middleindex;
}
else if(minindex > maxindex){
return nElement;
}else{
if(a[middleindex] < searchKey){
minindex = middleindex + 1;//注意还要加1,不包括前一次的中项
}
else{
maxindex = middleindex - 1;
}
}
}
}
public boolean delete(long value){
int j = find(value);
if(j == nElement){
return false;
}else{
for(int k = j; k < nElement; k++){
a[k] = a[k+1];
}
nElement--;
return true;
}
}
}
测试类:
public class OrderArrayApp {
public static void main(String[] args) {
int max = 50;
int searchKey = 66;
OrderArrayCopy o = new OrderArrayCopy(max);
o.insert(88);
o.insert(11);
o.insert(22);
o.insert(33);
o.insert(44);
o.insert(55);
o.insert(66);
o.insert(77);
o.insert(64);
o.show();
if(o.Find(searchKey)!=o.size())
{
System.out.print("Found:"+searchKey);
System.out.println();
}else{
System.out.print("NotFound:"+searchKey);
System.out.println();
}
o.delete(33);
o.delete(98);
o.show();
}
}
测试结果:
11 22 33 44 55 64 66 77 88
Found:66
11 22 44 55 64 66 77 88
总结:这种顺序数组存储结构的优点是经过排序的,结构非常的清晰。缺点就是插入和删除都比较慢,因为插入或删除一个数据就要启动多个数据。二分查找:这种查找效率是很高的,数据越多的时候这种算法的效率就越高,每次都去除一半的数据,效率是非常的高,不像之前的查找方法要逐个遍历,比如有一百万个数据,每个数据都要比较一次,那是非常耗时间的。
标签:
原文地址:http://my.oschina.net/u/2279675/blog/486467