Java归并排序之非递归

非递归的归并
其思想是:从头到尾将一个数组进行两两排序,每相邻的两个都排完顺序以后(若个数是单数,则最后一个放在原位不动),然后再四个数字进行排序,可分为两个有序的小数组归并排序,依此往后递推

代码

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];
			}
		}
		
	}

}
原文地址:https://www.cnblogs.com/hzcya1995/p/13309684.html