数据结构与算法之归并排

Posted self-crossing

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构与算法之归并排相关的知识,希望对你有一定的参考价值。

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

将某个问题划分为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];
        }

    }
}

 

以上是关于数据结构与算法之归并排的主要内容,如果未能解决你的问题,请参考以下文章

特征工程之归一化及标准化

如何使用导航组件在活动中并排显示 2 个片段 [关闭]

如何与代码并排打开 SwiftUI 预览? [复制]

Android强制Fragment重建View

让 qmake 与 32 位和 64 位并排安装一起工作

关闭 Lync 客户端(并排)与 Lync SDK 2013 留下孤立的进程