首先写一个数组类(这个是按照从小到大排列的数组)。插入操作:遍历整个数组,当找到该数据比要插入的数据后就跳出循环,然后从最后一个数据向前遍历,直到遍历到刚刚找到的那个数据项为止,每个数据往后移动一位,最后就往找到的那个位置插入该数值。删除操作:遍历数组,找到要删除的数据项,删除。查找操作:用二分查找法,每次都找到数据中间的一项,如果该项比要查找的数据大,那么把后一般的数据去掉,保留前一半的数据,然后再找前一半数据的中间项,重复这个方法直到找到为止。
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
总结:这种顺序数组存储结构的优点是经过排序的,结构非常的清晰。缺点就是插入和删除都比较慢,因为插入或删除一个数据就要启动多个数据。二分查找:这种查找效率是很高的,数据越多的时候这种算法的效率就越高,每次都去除一半的数据,效率是非常的高,不像之前的查找方法要逐个遍历,比如有一百万个数据,每个数据都要比较一次,那是非常耗时间的。
时间: 2024-09-29 18:56:05