归并排序(递归排序and外排排序)

分析:

/**
 * 归并排序  (先将数组利用归并排序排成 有序的左边数组和右边数组,再比较左边数组和右边数组的数值大小进行排序)
 *
 */
public class MergeSort {
    public static void mergeSort(int[] arr){
        if(arr.length<2 || arr==null){
            return;
        }
        mergeSort(arr,0,arr.length-1);
    }
    public static void mergeSort(int[] arr,int L,int R){
        if(L==R){
            return;
        }
        //中点位置
        int mid=L+((R-L)>>1);
        mergeSort(arr,L,mid);
        mergeSort(arr,mid+1,R);
        merge(arr,L,mid,R);
    }
    public static void merge(int[] arr,int L,int mid,int R){
        //临时数组存储
        int[] help=new int[R-L+1];
        //记录临时数组位置
        int i=0;
        //记录左边数组位置
        int p1=L;
        //记录右边数组位置
        int p2=mid+1;
        while (p1<=mid && p2<=R){
            help[i++]=arr[p1]<arr[p2]?arr[p1++]:arr[p2++];
        }
        //()将再将左边数组or右边数组中,排好序但是数值大,没有比较的数值放入临时数组中
        while (p1<=mid){
            help[i++]=arr[p1++];
        }
        while (p2<=R){
            help[i++]=arr[p2++];
        }
        //将排好序的临时数组的数值放入原来数组中
        for (int j = 0; j < help.length; j++) {
            arr[L+j]=help[j];
        }
    }
    //测试
    public static void main(String[] args) {
        //随机生成10个 1~40的数进行测试
        Random ran=new Random();
        int[] te=new int[10];
        for (int i = 0; i < 10; i++) {
             te[i]=ran.nextInt(40) + 1;
        }
        mergeSort(te);
        for (int i = 0; i < te.length; i++) {
            System.out.print(te[i]+" ");
        }
    }

}
原文地址:https://www.cnblogs.com/axu521/p/10440107.html