ButtomUpSort算法的JAVA实现
上课的时候,因为有很多人问: ButtomUpSort算法里面MERGE算法中带入了三个参数i+1,i+s,i+t到底是什么,所以老师顺带的讲了讲他们分别指p,q,r,但是i+1是如何而来的,至今也没有弄清楚,但是知道了这三个参数,那么代码的实现也就简单了。
代码如下:
/**
* @author Sheye
* @date 2019-09-17 17:34
*/
public class ButtomUpSort {
//A为排序数组,B为辅助数组
private static int[] A = {7,24,78,56,4,24,10,26,1,2,88,99};
private static int[] B = new int[A.length];
/**
* merge需要知道的参数。数组,p,q,r
* 参数1:数组A
* 参数2:p
* 参数3:q
* 参数4:r
*/
static void merge(int[] A,int p,int q,int r){
int k=p;
int s=p;
int t=q+1;
while ((s<=q)&&(t<=r)){
if (A[s]<=A[t]){
B[k]=A[s];
s=s+1;
}else {
B[k]=A[t];
t=t+1;
}
k=k+1;
}
if (s==q+1){
/**
* src - 源数组。
* srcPos - 源数组中的起始位置。
* dest - 目标数组。
* destPos - 目的地数据中的起始位置。
* length - 要复制的数组元素的数量。
*/
//+1的目的是多减了一个1
System.arraycopy(A,t,B,k,(r-t)+1); //B[r-k]=A[r-t];
}else {
System.arraycopy(A,s,B,k,(q-s)+1); //B[r-k]=A[q-s];
}
System.arraycopy(B,p,A,p,(r-p)+1); //A[r-p]=B[r-p];
}
static void buttomUpSort(){
int n =A.length; //a数组的长度
int t =1;
while(t<n){
int s=t; //合并序列的大小
t=2*s; //每次循环,序列大小*2
int i=0;
while((i+t)<=n){ //判断合并序列的大小小于等于a数组时进行循环排序
//减1是因为伪代码中是从1开始数起,而数组是从0开始
merge(A,i+1-1,i+s-1,i+t-1); //排序
i=i+t; //合并后合并序列的大小
}
if ((i+s)<n){ //两个要排序的序列边界
merge(A,i+1-1,i+s-1,n-1);
}
}
}
public static void main(String[] args) {
buttomUpSort();
for (int i=0;i<A.length;i++){
System.out.print(" "+B[i]);
}
}
}
算法的一些流程图在书中有详细简绍,主要是不会画图,如果不懂merge算法的实现,下面贴出链接
MERGE: https://blog.csdn.net/u014120081/article/details/100941042