归并排序,要将一个数组排序,可以先将它分成两半分别排序,然后将结构归并起来。
具体实现如下
public class Merge{
private Comparable[] aux;
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){
if(lo>=hi) return;
int mid = lo+ (hi-lo)/2;
sort(a,lo,mid);
sort(a,mid+1,hi);
merge(a,lo,mid,hi);
}
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++];
}
}
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);
}
}