《java数据结构与算法》——数组

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/insthink/article/details/53019914

一直琢磨着要好好学数据结构与算法,之前也零星地看了点,但是总是不成体系,我在网上也找了很多这方面的书,但是作为一个初学者,总希望能找到一本适合入门但是又比较实用的书,最后千挑万选地邂逅了《java数据结构与算法》(作者是Robert Lafore),简单地浏览了一下,顿时有了一种“就决定是你了的感觉”。如果你也是一个数据结构与算法的初心者,那我同样推荐你这本书。

之后应该会按章节来记录一下自己的学习心得,以及敲一下课后的编程作业来检验自己的学习成果。

Github: https://github.com/insthink/Java-data-structure


大O表示法

----------------------------------------------------------------------------------------------------------------------

大O表示法可以用来描述一个算法的时间复杂度,它可以简单地描述数据的规模与算法运行时间之间的数量级关系。比如:在无序数组中插入一个元素,则用大O表示法就是O(1),因为每次都是在末尾添加,所以只需要一次操作;而在有序数组中插入一个元素,用大O表示法就是O(N),因为不再是在末尾进行插入,而是要考虑到排列的顺序,分为“寻找”和“插入”两个步骤,假设要插入的位置在最中间,那“寻找”需要消耗N/2的正比时间,而“插入”也需要消耗N/2的正比时间(因为需要将N/2的数据先向上移动,才能插入)。

算法 大O表示运行时间
线性查找 O(N)
二分查找 O(logN)
无序数组插入 O(1)
有序数组插入 O(N)
无序数组删除 O(N)
有序数组删除 O(N)

编程作业

----------------------------------------------------------------------------------------------------------------------

2.5、设计一个merge()方法,使得将两个有序的源数组合并成一个有序的目的数组。

class OrdArray{
	private int[] a;
	private int nelem;
	//constructor
	public OrdArray(int size){
		a = new int[size];
		nelem = 0;
	}
	// binaray-search
	public boolean find(int search_key){
		int upper = nelem - 1;
		int down = 0;
		while(down <= upper){
			int mid = (upper + down) / 2;
			if(search_key == a[mid]) return true;
			else if(search_key < a[mid]) upper = mid - 1;
			else down = mid + 1;
		}
		return false;
	}
	// linear-insert
	public void insert(int elem){
		int i;
		for(i = 0; i < nelem; i++){
			if(elem < a[i]) break;
		}
		for(int k = nelem; k > i; k--){
			a[k] = a[k-1];
		}
		a[i] = elem;
		nelem++;
	}
	// linear-delete
	public boolean delete(int elem){
		if(find(elem) == false){
			System.out.println("Not found");
			return false;
		}
		else{
			for(int i = 0; i < nelem; i++){
				if(a[i] == elem){
					for(int k = i; k < nelem; k++){
						a[k] = a[k+1];
					}
					nelem--;
				}
			}
			return true;
		}
	}
	// display it
	public void display(){
		for(int i = 0; i < nelem; i++){
			System.out.print(a[i] + " ");
		}
		System.out.println("");
	}
	// merge two ordArray into the one
	// we can use the OrdArray instance within the class
	public OrdArray merge(OrdArray another_array){
		OrdArray dist = new OrdArray(this.nelem + another_array.nelem);
		
		for(int i = 0 ; i < this.nelem; i++){
			dist.insert(a[i]);
		}
		for(int i = 0; i < another_array.nelem; i++){
			dist.insert(another_array.a[i]);
		}
		return dist;

	}
}


public class OrdArrayApp{
	public static void main(String[] args){
		// left is a reference, right is an object
		OrdArray arr = new OrdArray(20);

		arr.insert(10);
		arr.insert(20);
		arr.insert(5);
		arr.insert(2);
		arr.insert(1);
		arr.insert(99);
		arr.insert(101);
		arr.display();	
		arr.delete(101);
		arr.display();
		// homework-2.5
		OrdArray arr1 = new OrdArray(10);
		arr1.insert(1);
		arr1.insert(3);
		arr1.insert(5);
		OrdArray arr2 = arr.merge(arr1);
		arr2.display();
	}
}




猜你喜欢

转载自blog.csdn.net/insthink/article/details/53019914
今日推荐