归并排序

在这里插入图片描述

概述

  归并排序的特点在于它的时间复杂度为O(nlogn)。而根据一个结论性的东西来说:最坏情况下比较方式的排序算法至少需要Ω(nlogn)的时间(结论来自邓俊辉版数据结构P59),这是比较性排序算法的极限。


计算时间复杂度

  (函数代码在下面)
不难看出merge函数的时间复杂度是O(n)
sort函数的时间复杂度主要来源于merge函数和两个自身的递归函数,于是:
T(n) = 2 x T(n / 2) + O(n)
T(1) = O(1)

递推函数计算思路学习自这个博客

思路和这个图是一样的。
图片名称

换元n= 2k,在最后一项时,省略后面的低次项为:T(n) = 2k-1[2T(1) + O(n)] = 2kO(1) + 2k-1O(n)
省略低次项 = 2k-1O(n) = 1/2 x 2kO(n)
去掉常系数 = 2kO(n)
把元换回来 = nlogn


源代码
class Solution {
public:
    vector<int> sortArray(vector<int>& nums) {
        sort(nums, 0, nums.size());
        return nums;
    }
private:
    void sort(vector<int>& nums, int lo, int hi) {
        if(hi - lo < 2) 
            return ;
        int mi = (lo + hi) / 2;
        sort(nums, lo, mi);
        sort(nums, mi, hi);
        merge(nums,lo, mi, hi);
    }
    void merge(vector<int>& nums, int lo, int mi, int hi){
        vector<int> vec(nums.begin() + lo, nums.begin() + mi);
        auto backBegin = nums.begin() + mi;
        auto backEnd = nums.begin() + hi;
        auto frontBegin = vec.begin();
        auto frontEnd = vec.end();
        for(auto i = nums.begin() + lo; i != nums.begin() + hi; ++i) {
            if(frontBegin != frontEnd && (backEnd == backBegin || *frontBegin <= *backBegin)) {
                *i = *frontBegin++;
            }else {
                *i = *backBegin++;
            }
        }
    }
};

leetcode:912. 排序数组

在这里插入图片描述
  在这个题目中冒泡排序会直接被第8个测试案例超出时间限制有趣的是:在这个题目的后半段大家都用的是归并排序,很多人的代码中还包含了被注释掉的冒泡排序。
  归并排序就是这个题目实际上的守门员(笑)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值