归并排序
要将一个数组 排序,可以先(递归地)将它分成两半分别排序,然后将结果归并起来,典型的分治处理思想。
证明
对于长度为N的任意数组,自顶向下的归并排序需要 ½NlgN 至 NlgN 次比较。
对于长度为N的任意数组,自顶向下的归并排序最多需要访问数组 6NlgN次。
特点
1、它能够保证将任意长度为 N 的数组排序所需时间和 NlogN 成正比。
2、缺点 则是它所需的额外空间和N成正。
public class Merge {
// 归并所需的辅助数组
private int[] aux;
public void sort(int[] a){
// 一次性分配空间
aux=new int[a.length];
sort(a,0,a.length-1);
}
public void sort(int[] 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);
}
// 归并结果
public void merge(int[] 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(aux[j]<aux[i]){
a[k]=aux[j++];
}else {
a[k]=aux[i++];
}
}
}
@Test
public void testMerge(){
int[] ints = new int[]{3, 2, 5, 3, 5, 25, 3, 5, 543, 535, 34, 53, 45,3,3,2,2,2,4324,2};
System.out.println(Arrays.toString(ints));
sort(ints);
System.out.println(Arrays.toString(ints));
}
}