归并排  就是一种分治的思想

将某个问题划分为n个小的同规模算法去解决

public class StudyMergeSort {

    /**
     * 归并排思路 :
     * 将一个数组分割成n个小组 然后每个小组两两比较
     */

    public static void main(String[] args) {
        int[] array = ArrayUtil.generateRandomArray(20, 20);

        ArrayUtil.printArray(array);
        mergeSort(array);
        System.out.println();
        ArrayUtil.printArray(array);
    }

    public static void mergeSort(int[] arr) {
        process(arr,0,arr.length-1);
    }

    public static void process(int[] arr, int L, int R) {


        if(L == R){
            return;
        }

        /** 中间数 */
        int M = L + ((R - L) >> 1);

        /** 分裂 */
        process(arr,L,M);
        process(arr,M+1,R);
        /** 合并 */
        merge(arr,L,M,R);
    }

    public static void merge(int[] arr, int L, int M, int R){
        int i = 0;
        int p1 = L;
        int p2 = M + 1;
        /** 辅助空间 */
        int [] help = new int [R - L  + 1];

        /** 将小的放到辅助空间中 */
        while(p1 <= M && p2 <= R){
            help[i++] = arr[p1] <= arr[p2] ? arr[p1++] : arr[p2++];
        }

        while(p1 <= M){
            help[i++] = arr[p1++];
        }

        while(p2 <= R){
            help[i++] = arr[p2++];
        }

        for (int j = 0; j < help.length; j++) {
            arr[L+j] = help[j];
        }

    }
}