• 十大经典排序之归并排序


    概要

    归并排序(Merge sort)是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。

    作为一种典型的分而治之思想的算法应用,归并排序的实现由两种方法:

    自上而下的递归(所有递归的方法都可以用迭代重写,所以就有了第 2 种方法);
    自下而上的迭代;

    整体架构流程

    1. 申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列;

    2. 设定两个指针,最初位置分别为两个已经排序序列的起始位置;

    3. 比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置;

    4. 重复步骤 3 直到某一指针达到序列尾;

    5. 将另一序列剩下的所有元素直接复制到合并序列尾。

    代码实现

    int min(int x, int y) {
        return x < y ? x : y;
    }
    void merge_sort(int arr[], int len) {
        int *a = arr;
        int *b = (int *) malloc(len * sizeof(int));
        int seg, start;
        for (seg = 1; seg < len; seg += seg) {
            for (start = 0; start < len; start += seg * 2) {
                int low = start, mid = min(start + seg, len), high = min(start + seg * 2, len);
                int k = low;
                int start1 = low, end1 = mid;
                int start2 = mid, end2 = high;
                while (start1 < end1 && start2 < end2)
                    b[k++] = a[start1] < a[start2] ? a[start1++] : a[start2++];
                while (start1 < end1)
                    b[k++] = a[start1++];
                while (start2 < end2)
                    b[k++] = a[start2++];
            }
            int *temp = a;
            a = b;
            b = temp;
        }
        if (a != arr) {
            int i;
            for (i = 0; i < len; i++)
                b[i] = a[i];
            b = a;
        }
        free(b);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    小结

    在《数据结构与算法 JavaScript 描述》中,作者给出了自下而上的迭代方法。但是对于递归法,作者却认为:
    However, it is not possible to do so in JavaScript, as the recursion goes too deep for the language to handle.
    然而,在 JavaScript 中这种方式不太可行,因为这个算法的递归深度对它来讲太深了。
    说实话,我不太理解这句话。意思是 JavaScript 编译器内存太小,递归太深容易造成内存溢出吗?还望有大神能够指教。
    和选择排序一样,归并排序的性能不受输入数据的影响,但表现比选择排序好的多,因为始终都是 O(nlogn) 的时间复杂度。代价是需要额外的内存空间。

  • 相关阅读:
    BI零售数据分析,当代零售企业的核心竞争力
    前端根据目录生成模块化路由routes
    NPS:使用 Windows NPS Server 部署 802.1X 无线认证(4)
    MariaDB落幕和思考
    景联文科技:深度了解语音识别之发音词典及语音数据采集标注
    Spring MVC 入门指南
    【深度学习】【Opencv】Python/C++调用onnx模型【基础】
    Google Earth Engine(GEE)——如何创建一个合适的list用来作为时间遍历
    Springboot Vue个人简历网站系统java项目源码
    tensorflow深度学习模型读取parquet数据进行训练实现
  • 原文地址:https://blog.csdn.net/cui211472325/article/details/136780583