public class MergeSort {
public static final int MAX_NUM = 99999999;
public void merge(int[] A, int p, int mid, int q) {
int n1 = mid - p + 1;
int n2 = q - mid;
int[] L = new int[n1 + 2];
int[] R = new int[n2 + 2];
L[n1 + 1] = MergeSort.MAX_NUM; //控制边界,重要!
R[n2 + 1] = MergeSort.MAX_NUM; //控制边界,重要!
for(int i = 1; i <= n1; i++) {
L[i] = A[p + i -1];
}
for(int i = 1; i <= n2; i++) {
R[i] = A[mid + i];
}
int l = 1;
int r = 1;
for(int i = p; i <= q; i++) {
if(L[l] <= R[r]) {
A[i] = L[l];
++l;
} else if(L[l] > R[r]) {
A[i] = R[r];
++r;
}
}
}
public void mergeSort(int[] A, int p, int q) {
if(p >= q) {
return;
}
int mid = (p + q)/2;
mergeSort(A, p, mid);
mergeSort(A, mid + 1, q);
merge(A, p, mid, q);
}
public static void main(String[] args) {
int[] a = {0, 18, 8, 5, 10, 6, 13, 14, 7, 5, 17};
MergeSort ms = new MergeSort();
ms.mergeSort(a, 1, a.length - 1);
HeapSort.pOut(a, a.length - 1);
}
}
public static final int MAX_NUM = 99999999;
public void merge(int[] A, int p, int mid, int q) {
int n1 = mid - p + 1;
int n2 = q - mid;
int[] L = new int[n1 + 2];
int[] R = new int[n2 + 2];
L[n1 + 1] = MergeSort.MAX_NUM; //控制边界,重要!
R[n2 + 1] = MergeSort.MAX_NUM; //控制边界,重要!
for(int i = 1; i <= n1; i++) {
L[i] = A[p + i -1];
}
for(int i = 1; i <= n2; i++) {
R[i] = A[mid + i];
}
int l = 1;
int r = 1;
for(int i = p; i <= q; i++) {
if(L[l] <= R[r]) {
A[i] = L[l];
++l;
} else if(L[l] > R[r]) {
A[i] = R[r];
++r;
}
}
}
public void mergeSort(int[] A, int p, int q) {
if(p >= q) {
return;
}
int mid = (p + q)/2;
mergeSort(A, p, mid);
mergeSort(A, mid + 1, q);
merge(A, p, mid, q);
}
public static void main(String[] args) {
int[] a = {0, 18, 8, 5, 10, 6, 13, 14, 7, 5, 17};
MergeSort ms = new MergeSort();
ms.mergeSort(a, 1, a.length - 1);
HeapSort.pOut(a, a.length - 1);
}
}