1. 证明与
相等。
2. 不使用警戒值的MergeSort
//文件名:MergeSort.java
//编译:javac MergeSort.java
//执行:java MergeSort -ea #-ea: enable assert
import java.util.Random;
public class MergeSort {
public static int[] b = new int[65535];
public static int[] c = new int[65535];
public static void sort(int[] a, int lo, int hi) {
if (hi <= lo) return;
int mid = lo + (hi - lo) / 2;
MergeSort.sort(a, lo, mid);
MergeSort.sort(a, mid + 1, hi);
for (int k = lo; k <= mid; k++) b[k - lo] = a[k];
for (int k = mid + 1; k <= hi; k++) c[k - mid - 1] = a[k];
int i = 0, j = 0;
for (int k = lo; k <= hi; k++) {
if (!(i < mid - lo + 1)) {
a[k] = c[j++];
} else if (!(j < hi - mid)) {
a[k] = b[i++];
} else {
if (c[j] < b[i]) a[k] = c[j++];
else a[k] = b[i++];
}
}
}
public static void main(String[] args) throws Exception {
int size = 65535;
int[] a = new int[size];
Random random = new Random();
for (int i = 0; i < size; i++) a[i] = random.nextInt(65535 * 2);
MergeSort.sort(a, 0, size - 1);
for (int i = 1; i < size; i++) assert a[i - 1] <= a[i];
}
}
3. 三路归并排序(三向MergeSort),使用警戒值。
I.分段,假设共
个元素,分为三段:
II.每一次选择元素保证使用两次比较
//文件名:TriMergeSort.java
//编译:javac TriMergeSort.java
//执行:java TriMergeSort -ea # -ea: enable assert
import java.util.Random;
public class TriMergeSort {
public static int[] b = new int[65535];
public static int[] c = new int[65535];
public static int[] d = new int[65535];
public static void sort(int[] a, int lo, int hi) {
if (hi <= lo) return;
// divide [lo, hi] into [lo,barrier_1], [barrier_1+1, barrier_2-1], [barrier_2, hi]
int barrier_1 = lo + (hi - lo + 1) / 3 - 1;
int barrier_2 = hi - (hi - lo + 3) / 3 + 1;
TriMergeSort.sort(a, lo, barrier_1);
TriMergeSort.sort(a, barrier_1 + 1, barrier_2 - 1);
TriMergeSort.sort(a, barrier_2, hi);
for (int k = lo; k <= barrier_1; k++) b[k - lo] = a[k];
for (int k = barrier_1 + 1; k <= barrier_2 - 1; k++) c[k - barrier_1 - 1] = a[k];
for (int k = barrier_2; k <= hi; k++) d[k - barrier_2] = a[k];
b[barrier_1 - lo + 1] = Integer.MAX_VALUE;
c[barrier_2 - barrier_1 - 1] = Integer.MAX_VALUE;
d[hi - barrier_2 + 1] = Integer.MAX_VALUE;
int i = 0, j = 0, k = 0;
for (int m = lo; m <= hi; m++) {
if (b[i] <= c[j]) {
if (d[k] <= b[i]) a[m] = d[k++];
else a[m] = b[i++];
} else {
if (d[k] <= c[j]) a[m] = d[k++];
else a[m] = c[j++];
}
}
}
public static void main(String[] args) throws Exception {
int size = 65535;
int[] a = new int[size];
Random random = new Random();
for (int i = 0; i < size; i++) a[i] = random.nextInt(65535 * 2);
TriMergeSort.sort(a, 0, size - 1);
for (int i = 1; i < size; i++) assert a[i - 1] <= a[i];
}
}
4. MergeSort证明
5. MergeSort证明
6. 分析三路归并(三向MergeSort)排序使用的比较次数