非递归的归并
其思想是:从头到尾将一个数组进行两两排序,每相邻的两个都排完顺序以后(若个数是单数,则最后一个放在原位不动),然后再四个数字进行排序,可分为两个有序的小数组归并排序,依此往后递推
代码
import java.util.Scanner;
public class MergerSort非递归归并排序 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
int array[]=new int[n];
for(int i=0;i<n;i++) {
array[i]=sc.nextInt();
}
merge(array);
for(int i =0;i<n;i++) {
System.out.print(array[i]+" ");
}
}
private static void merge(int[] array) {
int arrayB[]=new int[array.length];
int s=1;
while(s<array.length) {
mergePass(array,arrayB,s);//复制到B数组
mergePass(arrayB,array,s);//复制到A数组
s+=s;//s的取值,1/2/4/8/16
}
}
private static void mergePass(int[] array, int[] arrayB, int s) {
int i=0;
while(i<=array.length-2*s) {
//如果数组的长度为偶数,将相邻的两个数字恰好能两两比较大小
mergeSort(array,arrayB,i,i+s-1,i+2*s-1);
i=i+2*s;
}
if(i<array.length-s) {
mergeSort(array,arrayB,i,i+s-1,array.length-1);//这个的功能
}else {
for(int j=i;j<array.length;j++) {
arrayB[i]=array[i];//这个的功能
}
}
}
private static void mergeSort(int[] array, int[] arrayB, int i, int j, int k) {
int lefta=i;
int middle=j;
int leftb=j+1;
int right=k;
int ll=i;
while((lefta<=middle)&&(leftb<=right)) {
if(array[lefta]<=array[leftb]) {
arrayB[ll++]=array[lefta++];
}
else {
arrayB[ll++]=array[leftb++];
}
}
if(lefta>middle) {
for(int p=leftb;p<=right;p++) {
arrayB[ll++]=array[p];
}
}else {
for(int p=lefta;p<=middle;p++) {
arrayB[ll++]=array[p];
}
}
}
}