zoukankan      html  css  js  c++  java
  • 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];
    			}
    		}
    		
    	}
    
    }
  • 相关阅读:
    1>/dev/null 2>&1的含义
    rpm常用命令及rpm参数介绍
    linux按位运算
    关于比较运算符的一个例子
    js屏蔽效果
    jquery异步提交无刷新
    常用js验证
    获取输入字符的首字母(中文为拼音首字母)
    SQL查询合并字符串
    获取鼠标点击的坐标处理
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13309684.html
Copyright © 2011-2022 走看看