归并排序算法(优化版)——C++

关于归并排序的介绍可以参考这边博客:归并排序算法(经典返回变量版)——C++_净无邪博客-CSDN博客。本文主要是对递归排序进行优化。

由于经典版本返回临时变量的归并排序效率比较低,需要多每次创建临时空间进行优化,使用一个固定内存空间,这样可以减少每次创建和销毁内存空间的时间消耗,由于这部分很费时间,所以优化效果是比较明显的。

优化版跟基本版的区别主要区别如下:

1.归并函数原来是入参两个数组,优化后入参为两个待排序数组合并在一起的起始和截止位置,如下所示:

void merge1(vector<int>& nums, int start, int end, vector<int>& tmpNums); // 优化后版本
vector<int> merge(vector<int>& nums1, vector<int>& nums2); // 优化前版本

由上面代码可知,优化后除了包含两个有序代码数组的起始和截止位置,还多了一个存储临时变量的数组

2.归并排序进行“分”的二分法操作时,递归顺序仍然和原来一样都是先递归遍历左边元素再遍历右边元素,等两边元素都有序后再调用合并函数将两个有序数组合并成一个数组存储在临时存储空间tmpNums中。

优化后递归函数

void Sorts::merge(vector<int>& nums, int start, int end, vector<int>& tmpNums)
{
    if (start == end) //递归终止条件:如果起始下标等于结束下标,则终止递归
        return; // 返回
    int middle = (start + end) / 2; // 分治法,采用二分法,取中间下标开始左右递归,直到一个元素开始返回
    merge(nums, start, middle, tmpNums); // 先递归左边部分,退出该层后向右递归,直到一个元素
    print(tmpNums);
    merge(nums, middle + 1, end, tmpNums); // 先左边再右边递归取有序数组
    merge1(nums,
  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

三公子Tjq

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值