自底向上的归并排序和自顶向下的归并排序差不多,基本思想都是利用分治。需要注意的是管理好每次排序的lo,mid.hi的值
具体实现:
public class Merge{
private Comparable[] aux;
//排序
public static void sort(Comparable[] a){
aux = new Comparable[a.length];
for(int sz=1;sz<N;sz+=sz){ //sz为每次归并的子串长度
for(int lo=0;lo<N;lo+=sz+sz){
merge(a,lo,lo+sz-1,Math.min(N-1,lo+sz+sz-1);
}
}
}
//归并两个数组
private static void merge(Comparable [] a,int lo,int mid,int hi){
for(int i=lo;i<=hi;i++)
aux[i]=a[i];
int j=lo;
int k = mid+1;
for(int i=lo,i<=hi;i++){
if(j>mid) a[i] = aux[k++];
else if(k>hi) a[i] = aux[j++];
else if(less(a[j],a[k])) a[i] = aux[j++];
else a[i] = aux[k++];
}
}
//判断q是否小于p
private static boolean less(Comparable q,Comparable p) {
return q.compareTo(p)<0;
}
//展示数组
public static void show(Comparable[] a) {
for(int i=0;i<a.length;i++) {
System.out.print(a[i]+" ");
}
System.out.println();
}
//判断数组是否有序
public static boolean isSorted(Comparable[] a) {
for(int i =1;i<a.length;i++) {
if(less(a[i],a[i-1])) {
return false;
}
}
return true;
}
//测试
public static void main(String[] args) {
Integer[] a = {5,2,9,8,6,3,0,15,25,46,10,1,9,4,7};
sort(a);
assert isSorted(a);
show(a);
}
}