归并是利用二叉树的思想来实现
将一个数组分成2个,再次分,再次分。一直分,然后再利用递归来实现。1个和另一个组成一个,两个再与另外两个有序的组成一个大的。一直进行下去。
分为自顶向下和自底向上
向下:
package sorts;
import object.Example;
import object.Merge;
public class Merge_toptobottom extends Example{
private static Comparable[] aux;
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];}//将a赋到aux中,再通过aux将数组赋值给a
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++];}
//i是lo向右,j是mid+向右也就是分别是两个数组的头。进行比较这个的是说如果aux[j]小于aux[i]
,那么就把数组aux[j]他小啊,将其放入a[k]中
else {a[k]=aux[i++];}
//这个就是左边的数组的那个值小,将其放入
}
}
public static void sort(Comparable[] 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 static void main(String[] a){
Comparable[] ac = new Comparable[]{7,6,5,8,9,4,9,3,1,5,2,1,5,4};
aux = new Comparable[ac.length];
sort(ac, 0, ac.length-1);
show(ac);
}
}
自底向上:
package sorts;
import object.Example;
public class Merge_bottomtotop extends Example{
private static Comparable[] aux;
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++];}
}
}
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.min(lo+sz+sz-1, N-1));
}
}
}
public static void main(String[] a){
Comparable[] ac= new Comparable[]{6,5,7,4,8,3,9,2,0,1,5};
sort(ac);
show(ac);
}
}
参考:
http://blog.csdn.net/kwang0131/article/details/51074899
http://blog.csdn.net/jianyuerensheng/article/details/51262984
http://blog.csdn.net/linsheng9731/article/details/22928671
主要对merge的代码的解释,后面的主要是使用merge然后递归
merge是合并数组
比如上面的利用递归的,然后分成两个,最后merge合并
将合并的数组添加到aux中