public class Merge {
@SuppressWarnings("rawtypes")
private static Comparable[] aux;
public static <T> void sort(Comparable<T> [] a) {
aux = new Comparable[a.length];
sort(a, 0, a.length - 1);
}
private static <T> void sort(Comparable<T> [] a, int lo, int hi) {
if (hi <= lo) {
return;
}
int mid = lo + (hi -lo) / 2;
sort(a, lo, mid); // 将左半边排序
sort(a, mid + 1, hi); // 将右半边排序
merge(a, lo, mid, hi); // 归并结果
}
@SuppressWarnings("unchecked")
private static <T> void merge(Comparable<T>[] a, int lo, int mid, int hi) {
// i初始化为最左边的元素
// j初始化为最右边的元素
int i = lo, j = mid + 1;
for (int k = lo; k <= hi; k ++) {
aux[k] = a[k];
}
// k和i, j同时移动
for (int k = lo; k <= hi; k ++) {
if (i > mid) { // 左边用完
a[k] = aux[j ++]; // 取右边的元素
} else if (j > hi) { // 右边用完
a[k] = aux[i ++]; // 去左边的元素
} else if (aux[j].compareTo(aux[i]) < 0) { // 右边比左边小
a[k] = aux[j ++]; // 取右边的
} else { // 左边比右边小
a[k] = aux[i ++]; // 取左边的
}
}
}
}
归并排序(借助额外空间)
最新推荐文章于 2024-10-11 17:30:36 发布