码迷,mamicode.com
首页 > 其他好文 > 详细

记录我学习数据结构之路(四)

时间:2015-08-01 17:29:37      阅读:148      评论:0      收藏:0      [点我收藏+]

标签:

首先写一个数组类(这个是按照从小到大排列的数组)。插入操作:遍历整个数组,当找到该数据比要插入的数据后就跳出循环,然后从最后一个数据向前遍历,直到遍历到刚刚找到的那个数据项为止,每个数据往后移动一位,最后就往找到的那个位置插入该数值。删除操作:遍历数组,找到要删除的数据项,删除。查找操作:用二分查找法,每次都找到数据中间的一项,如果该项比要查找的数据大,那么把后一般的数据去掉,保留前一半的数据,然后再找前一半数据的中间项,重复这个方法直到找到为止。

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!