博客
关于我
归并排序
阅读量:336 次
发布时间:2019-03-04

本文共 2335 字,大约阅读时间需要 7 分钟。

递归法与非递归法的实现与对比

递归法实现

递归排序法通过不断将数组划分为较小的子数组并进行归并,最终得到有序数组。其核心思想是将问题分解,解决子问题后再合并结果。如图所示,递归排序法通过递归划分数组并进行归并,最终得到有序数组。

实现代码

void Merge(int *arr, int begin, int mid, int end, int *temp) {    int begin1 = begin, end1 = mid;    int begin2 = mid + 1, end2 = end;    int sub = begin;    while (begin1 <= end1 && begin2 <= end2) {        if (arr[begin1] <= arr[begin2])            temp[sub++] = arr[begin1++];        else            temp[sub++] = arr[begin2++];    }    if (begin1 <= end1)        memcpy(temp + sub, arr + begin1, sizeof(int) * (end1 - begin1 + 1));    if (begin2 <= end2)        memcpy(temp + sub, arr + begin2, sizeof(int) * (end2 - begin2 + 1));    memcpy(arr + begin, temp + begin, sizeof(int) * (end - begin + 1));}void MergeR(int *arr, int begin, int end, int *temp) {    if (begin >= end)        return;    int mid = begin + (end - begin) / 2;    MergeR(arr, begin, mid, temp);    MergeR(arr, mid + 1, end, temp);    Merge(arr, begin, mid, end, temp);}void MergeSort(int *arr, int begin, int end, int size) {    assert(arr);    int *temp = (int *)malloc(sizeof(int) * size);    MergeR(arr, begin, end, temp);    free(temp);}

非递归实现方法

非递归实现的基本思想与递归方法类似,但实现方式不同。非递归算法通过循环来模拟递归的分解与合并过程。具体而言,我们需要定义一个变量来控制合并的步伐,并严格控制边界条件。

实现代码

void _Merge(int *arr, int begin1, int end1, int begin2, int end2, int *temp) {    int _begin1 = begin1;    int sub = begin1;    while (begin1 <= end1 && begin2 <= end2) {        if (arr[begin1] <= arr[begin2])            temp[sub++] = arr[begin1++];        else            temp[sub++] = arr[begin2++];    }    if (begin1 <= end1)        memcpy(temp + sub, arr + begin1, sizeof(int) * (end1 - begin1 + 1));    if (begin2 <= end2)        memcpy(temp + sub, arr + begin2, sizeof(int) * (end2 - begin2 + 1));    memcpy(arr + _begin1, temp + _begin1, sizeof(int) * (end2 - _begin1 + 1));}void MergeSortNoR(int *arr, int size) {    assert(arr);    int *temp = (int *)malloc(sizeof(int) * size);    int gap = 1;    while (gap < size) {        for (int i = 0; i < size; i += gap) {            int end1 = i + gap - 1;            int begin2 = i + gap;            int end2 = begin2 + gap - 1;            if (end2 >= size)                end2 = size - 1;            _Merge(arr, i, end1, begin2, end2, temp);        }        gap *= 2;    }    free(temp);}

特性

递归排序法和非递归排序法在时间复杂度和空间复杂度上都有其独特之处。通过对比两种方法,可以更好地理解其优缺点。

转载地址:http://hmse.baihongyu.com/

你可能感兴趣的文章
MySQL用户管理:添加用户、授权、删除用户
查看>>
比技术还重要的事
查看>>
linux线程调度策略
查看>>
软中断和实时性
查看>>
Linux探测工具BCC(可观测性)
查看>>
Opentelemetry Metrics SDK
查看>>
流量控制--2.传统的流量控制元素
查看>>
SNMP介绍及使用,超有用,建议收藏!
查看>>
SDUT2161:Simple Game(NIM博弈+巴什博弈)
查看>>
51nod 1596 搬货物(二进制处理)
查看>>
来自星星的祝福(容斥+排列组合)
查看>>
Hmz 的女装(递推)
查看>>
HDU5589:Tree(莫队+01字典树)
查看>>
Codeforces Round #459 (Div. 2):D. MADMAX(记忆化搜索+博弈论)
查看>>
不停机替换线上代码? 你没听错,Arthas它能做到
查看>>
sharding-jdbc 分库分表的 4种分片策略,还蛮简单的
查看>>
分库分表的 9种分布式主键ID 生成方案,挺全乎的
查看>>
MySQL不会丢失数据的秘密,就藏在它的 7种日志里
查看>>
Python开发之序列化与反序列化:pickle、json模块使用详解
查看>>
回顾-生成 vs 判别模型-和图
查看>>