import java.util.Arrays;
public class Merge {
private static Comparable[] aux; // 归并所需的辅助数组
public static void merge(Comparable[] a, int lo, int mid, int hi) {
// 将a[lo..mid] 和 a[mid+1..hi]归并
int i = lo, j = mid + 1;
for (int k = lo; k <= hi; k++) {
// 将a[lo..hi]复制到aux[lo..hi]
aux[k] = a[k];
}
for (int k = lo; k <= hi; k++) {
// 归并回到a[lo..hi]
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++];
}
}
public static void sort(Comparable[] a) {
aux = new Comparable[a.length]; //一次性分配空间
sort(a, 0, a.length-1);
}
private static void sort(Comparable[] a, int lo, int hi) {
// 将数组a[lo...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); //归并结果
}
public static void main(String[] args) {
//自顶向下的归并排序
Integer a[] = {3,9,45,69,25,1,24,89,40};
sort(a);
System.out.println(Arrays.toString(a));
}
}
直接编译会提示:

注: Merge.java使用了未经检查或不安全的操作。
注: 有关详细信息, 请使用 -Xlint:unchecked 重新编译。
注: 某些消息已经过简化; 请使用 -Xdiags:verbose 重新编译以获得完整输出
但是已经生成字节码文件(.class),说明编译通过了,运行后也能得出正确答案.
经过查阅,是没有使用泛型,comparable后面加上<Integer>,但是本题为了保持sort函数的复用性,就没有加.
还有值得注意的一点是,定义数组时不能使用(int,double,string)等,而应该使用(Integer,Double,String)否则想Comparable转换的时候会出错.
网友评论