zoukankan      html  css  js  c++  java
  • Java归并排序之递归

    归并排序的基本思想:
    将一个给定的数组,从中间断开,如[1,7,2,5,6,3];
    前面的一段是A:[1,7,2]
    后面一段是B:[5,6,3];
    我们第一步就是将这一个大的数组分为两个A和B
    继续将A和B分开C[1,7], D[2], E[5,6], F[ 3];
    C和D还可以再分G[1],H[7],I[5],O[6];
    所有的数组都无法再分
    开始合并
    G[1]和H[7]排序C[1,7]
    I[5]和O[6]排序[5,6];
    C[1,7]和D[2]排序
    A[1,2,7]
    同理B[3,5,6]
    最后【1,2,3,5,6,7】

    import java.util.Scanner;
    
    public class MergeSort归并排序 {
    
    	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];
    	    int arrayB[]=new int[array.length];
    	    for(int i=0;i<n;i++) {
    	    	array[i]=sc.nextInt();
    	    }
    	    mergesort(array,arrayB,0,n-1);
    	    for(int i=0;i<n;i++) {
    			System.out.print(array[i]+" ");
    		}
    	    System.out.println();
    
    	}
    
    	private static void mergesort(int[] array,int arrayB[] ,int left, int right) {
    		
    		if(left<right) {
    			
    			int middle=(left+right)/2;
    			mergesort(array,arrayB,left,middle);//递归,将左边的数组进行递归
    			mergesort(array,arrayB,middle+1,right);//递归,将右边得数字进行递归
    			merge(array,arrayB,left,middle,right);//最后排序的都是有序的两段序列,原因是当分到只有一个元素再进行merge()排序得到的肯定是有序的
    			copy(array,arrayB,left,right);
    			
    		}
    	}
    
    	private static void copy(int[] array, int[] arrayB, int left, int right) {
    		for(int i=left;i<=right;i++) {
    			array[i]=arrayB[i];
    		}
    		
    	}
    
    	private static void merge(int[] array, int[] arrayB, int left, int middle, int right) {
    		int i=left;
    		int j=middle+1;
    		int k=left;
    		while((i<=middle)&&(j<=right)) {
    			if(array[i]<array[j]) {
    				arrayB[k++]=array[i++];
    			}else {
    				arrayB[k++]=array[j++];
    			}
    		}
    		if(i>middle) {
    			for(int p=j;p<=right;p++) {
    				arrayB[k++]=array[p];
    			}
    		}
    		else {
    			for(int p=i;p<=middle;p++) {
    				arrayB[k++]=array[p];
    			}
    		}
    		
    	}
    
    }
  • 相关阅读:
    python socket练习
    python异常处理
    python类的反射
    类的特殊成员方法
    staticmethod classmethod property方法
    类的多态
    类的析构、继承
    python subprocess模块
    python面向对象
    discuz 使模板中的函数不解析 正常使用
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13309685.html
Copyright © 2011-2022 走看看