思想:将两个有序的数组归并到一个更大的有序数组
自顶向下排序
public class Merge
{
private static 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)
{//将数组[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 merge(Comparable[] a,int lo,int mid,int hi)
{
int i=lo,j=mid+1;
for(int k=lo;k<=hi;k++)
aux[k]=a[k];
for(int k=lo;k<=hi;k++)
if(i>mid)
a[k]=aux[j++];//左半边元素用尽,一直放右半边元素
else if(j>hi)
a[k]=aux[i++];
else if(less(aux[j],aux[i]))
a[k]=aux[j++];
else
a[k]=aux[i++];
}
private static boolean less(Comparable v,Comparable W)
{
return v.ComparableTo(w)<0;
}
}
自底向上归并排序
public class MergeBU
{
private static Comparable[] aux;
public static void sort(Comparable[] a)
{
int N=a.length;
aux=new Comparable[N];
for(int sz=1;sz<N;sz=sz+sz)
for(int lo=0;lo<N-sz;lo+=sz+sz)
merge(a,lo,lo+sz-1,Math(lo+sz+sz-1,N-1)):
}
public static void merge(Comparable[] a,int lo,int mid,int hi)
{
int i=lo,j=mid+1;
for(int k=lo;k<=hi;k++)
aux[k]=a[k];
for(int k=lo;k<=hi;k++)
if(i>mid)
a[k]=aux[j++];//左半边元素用尽,一直放右半边元素
else if(j>hi)
a[k]=aux[i++];
else if(less(aux[j],aux[i]))
a[k]=aux[j++];
else
a[k]=aux[i++];
}
}