最近再看算法导论这本书,试着写了一下书中的例子,将伪代码改成java代码。
下面是插入排序算法,最坏时间复杂度为O(n2)。
public static void INSERTION_SORT(int[] array) {
for (int i = 1; i < array.length; i++) {
int key = array[i];
int j = i - 1;
while (j >= 0 && array[j] > key) {
array[j + 1] = array[j];
j--;
}
array[j + 1] = key;
}
}
下面是选择法排序,最坏时间复杂度也为O(n2)
public static void SELECTION_SORT(int[] array) {
for (int i = 0; i < array.length - 1; i++) {
int temp = i;
for (int j = i + 1; j < array.length; j++) {
if (array[j] < array[temp]) {
temp = j;
}
}
if (temp != i) {
int c = array[i];
array[i] = array[temp];
array[temp] = c;
}
}
}
下面是合并排序算法,时间复杂度为O(nlogn)。
public static void MERGE(int A[], int p, int q, int r) {
int n1 = q - p + 1;
int n2 = r - q;
int[] L = new int[n1 + 1];
int[] R = new int[n2 + 1];
for (int i = 0; i < n1; i++) {
L[i] = A[p + i];
}
for (int j = 0; j < n2; j++) {
R[j] = A[q + j + 1];
}
L[n1] = Integer.MAX_VALUE;//设置哨兵
R[n2] = Integer.MAX_VALUE;
int i = 0;
int j = 0;
for (int k = p; k <= r; k++) {//依次选两边最小的,插入A数组
if (L[i] < R[j]) {
A[k] = L[i];
i++;
} else {
A[k] = R[j];
j++;
}
}
}
public static void MERGE_SORT(int[] A, int p, int r) {
if (p < r) {
int q = (p + r) / 2;
MERGE_SORT(A, p, q);//排序左半部分
MERGE_SORT(A, q + 1, r);//排序有半部分
MERGE(A, p, q, r);//合并
}
}