《算法导论》学习记录
/**
* 归并排序
* O(nlogn)
* @param A 待排序的数组
* @param p 数组的左端点:1
* @param r 数组的右端点:A.length
*/
public static void MERGESORT(int[] A, int p, int r) {
if(p < r) {
int q = (p + r) / 2;
// 1. 先分解待排序的数组,成两个子序列
MERGESORT(A, p, q);
MERGESORT(A, q + 1, r);
// 2.3. 解决排序并合并
MERGE_UP(A, p, q, r);
}
}
public static void MERGE_UP(int[] A, int p, int q, int r) {
// 分别取两个子序列的长度新建两个数组(此时两个子序列已经各自排好序)
int lenleft = q - p + 1;
int lenright = r - q;
// 在数组的末尾设立一个极值(设置哨兵)
int[] L = new int[lenleft + 1];
int[] R = new int[lenright + 1];
for(int i = 0; i < lenleft; i++) {
L[i] = A[p - 1 + i];
}
for(int j = 0; j < lenright; j++) {
R[j] = A[q + j];
}
L[lenleft] = Integer.MAX_VALUE; // 取极值
R[lenright] = Integer.MAX_VALUE;
// 合并两个子序列(归并排序)
int i = 0, j = 0;
for(int k = p - 1; k < r; k++) { // 由于 Java 数组从 0 下标开始,所以要做一些处理
// 把 <= 换成 >= 即可变成降序归并,同时需要把 MAX_VALUE 改成 MIN_VALUE
if(L[i] <= R[j]) {
A[k] = L[i++];
}
else {
A[k] = R[j++];
}
}
// 此时 A[p..r] 已排好序
} 
京公网安备 11010502036488号