算法导论第二章笔记

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);
		}
	}

猜你喜欢

转载自blog.csdn.net/sscout/article/details/81369436