归并排序 merge(a,lo,mid,hi); //将子数组 a[lo...mid] 和 a[mid+1....hi] 归并 ,这里两个子数组是有序的;
代码:
public static void merge(int[] a, int lo,int mid,int hi) {
int i=lo;
int j=mid+1;
int[] aux=new int[hi-lo+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 (a[i]<a[j]) a[k]=aux[i++];
else a[k]=aux[j++];
}
}
i 是低指针 ; j 是高指针
merge方法进行了四个判断: i>mid 左半边元素用尽,一直放右半边元素即可
j>hi 右半边元素用尽,一直放左半边元素即可
a[i]<a[j] 左边元素小于右边元素,放左边元素
a[i]>a[j] 左边元素大于右边元素,放右边元素
自顶向下的归并排序
代码:
public static void sort(int[] a,int lo,int hi){
if(hi<=lo) return;
int mid=lo+(lo+hi)/2;
sort(a,lo,mid);
sort(a,mid+1,hi);
merge(a,lo,mid,hi);
}
自底向上的归并排序
public static void sort(int[] a){
int N=a.length;
int[] aux=new int[N];
for(int sz=1;sz<N;sz=zs+sz){
for(int lo=0;lo<N-sz;lo=lo+2*sz){
merge(a,lo,lo+sz-1,Math.min(lo+sz+sz-1,N-1);
}
}
}