博客
关于我
归并排序
阅读量:335 次
发布时间: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/

你可能感兴趣的文章
华为社招笔试
查看>>
MFC的Dlg和App什么区别?应用程序类与对话框类
查看>>
C\C++下获取系统进程或线程ID(转)
查看>>
VS环境变量(转)
查看>>
C++中找资源或者函数的方法
查看>>
一些留给自己的思考题(只求回过头来能够有所获)
查看>>
SQL函数返回表的写法
查看>>
delete对象时会自动调用类的析构函数
查看>>
C++ 子类对象直接赋值给父类对象可行,反过来不行
查看>>
WMWare下安装centOS7,并使用xshell进行连接记录.
查看>>
linux下同一个动态库名为何辣么多的.so文件
查看>>
SQL联表的方式(逗号, Left Join, Right Join)
查看>>
牛客网输入输出举例
查看>>
字符串初始化时的注意点
查看>>
dll路径加载顺序
查看>>
悬垂指针和野指针的区别
查看>>
软考相关试题
查看>>
顺序表的操作
查看>>
常量表达式
查看>>
POD类型
查看>>