自底向下的原地归并排序
归并排序详情请查看:自顶向下的原地归并排序
这是归并排序的另外一种实现方法。
思路:先归并那些微型数组,然后再成对的归并得到的子数组。
实例:
import java.util.Random;
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.min(lo+sz+sz-1,n-1));
}
}
}
private static void merge(Comparable[] a,int start,int mid,int end){
//将a[start-mid]和a[(mid+1)-end]归并
int i =start;
int j = mid+1;
for(int k = start;k<=end;k++){
aux[k]=a[k]; //先复制数组
}
for(int k =start;k<=end;k++){ //进行归并操作,将左右归并
if(i>mid)
a[k]=aux[j++];
else if(j>end)
a[k]=aux[i++];
else if(less(aux[i],aux[j]))
a[k]=aux[i++];
else
a[k]=aux[j++];
}
}
//less(),each(),show()以及测试代码见博主其他排序文章,篇幅有限,这里不给出
//https://blog.csdn.net/qq_41906510/article/details/105590998
}
跟踪归并过程:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200418191809110.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxOTA2NTEw,size_16,color_FFFFFF,t_70)