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