演算法導論第二章筆記

sscout發表於2018-08-02

2.1筆記

插入排序程式碼實現,這是按書本的虛擬碼實現的

public static void insertionSort(int[] arr) {
		for(int i = 1;i < arr.length;i++) {
			int key = arr[i];
			int j = i-1;
			while(j >= 0 && key < arr[j]) {
				arr[j+1] = arr[j];
				j--;
			}
			arr[j+1] = key;
		}
	}

按自己的理解實現

public static void insertionSort(int[] arr) {
		for(int i = 1;i < arr.length;i++) {
			int j = i;
			while(j >= 1 && arr[j] < arr[j-1]) {
				int temp = arr[j];
				arr[j] = arr[j-1];
				arr[j-1] = temp;
				j--;
			}
		}
	}

迴圈不變式性質:

     初始化:迴圈的第一次迭代之前,它為真。

     保持:如果迴圈的某次迭代之前它為真,那麼下次迭代之前它仍為真。

     終止:在迴圈終止時,不變式為我們提供了一個有用的性質,該性質有助於證明演算法是正確的。(並且迴圈不變式仍然成立)

 

2.3筆記

merge sort程式碼實現

public static void combine(int[] arr,int p,int q,int r) {
		int n1 = q-p+1;
		int n2 = r-q;
		
		int[] arr1 = new int[n1+1];
		int[] arr2 = new int[n2+1];
		
		for(int i = 0;i < n1;i++) {
			arr1[i] = arr[p+i];
		}
		for(int j = 0;j < n2;j++) {
			arr2[j] = arr[q+1+j];
		}
		
		arr1[n1] = Integer.MAX_VALUE;
		arr2[n2] = Integer.MAX_VALUE;
		
		int i = 0;
		int j = 0;
		for(int k = p; k <= r;k++) {
			if(arr1[i] <= arr2[j]) {
				arr[k] = arr1[i];
				i += 1;
			}else {
				arr[k] = arr2[j];
				j += 1;
			}
		}
	}



public static void mergeSort(int[] arr,int p,int r) {
		if(p < r) {
			int q = (r+p)/2;
			mergeSort(arr,p,q);
			mergeSort(arr,q+1,r);
			combine(arr,p,q,r);
		}
	}

相關文章