几篇排位很高的和原地归并算法的博客比如:
https://blog.csdn.net/acdreamers/article/details/24244643
都将原地归并算法的复杂度归为 O ( n log ⁡ n ) O(n\log n) O(nlogn)的。

但实际上经过一番计算发现,利用线性数组+手摇算法实现的原地归并,算法复杂度在 O ( n 2 ) O(n^2) O(n2)。
通过链表实现才是 O ( n log ⁡ n ) O(n\log n) O(nlogn)的。

链表实现nlogn

借用原文章中利用线性数组实现的图,简单说明这一点。

假设利用单向链表进行实现,我们将图中ijindex之前的元素用三个指针p1,p2,p3指向。利用如下过程实现常数时间的手摇。

tmp = p1->next;
p1->next = p2->next;
p2->next = p3->next;
p3->next = tmp;
delete tmp;

那么即便最坏的情况也只是进行n/2次链表手摇。
T ( n ) = c ⋅ n 2 + 2 T ( n 2 ) T(n)=c\cdot\frac{n}{2}+2T(\frac{n}{2}) T(n)=c⋅2n​+2T(2n​)
复杂度为 O ( n log ⁡ n ) O(n\log n) O(nlogn)

手摇数组实现n方

相比之前提到的利用线性数组+手摇实现的,我们可以构造这样一个序列:

1,3,5,7,   2,4,6,8

这样每推进一位就需要进行一次手摇。而每次手摇算法的开销为 n 2 ⋅ 1 2 \displaystyle\frac{n}{2}\cdot\frac{1}{2} 2n​⋅21​,随序列剪短,需要进行手摇的序列长度从 n 2 \frac{n}{2} 2n​逐一缩短为1。等差求和为 c n 2 cn^2 cn2
但注意,这个算法复杂度并非 n 2 log ⁡ n n^2\log n n2logn 其实就算n方也本来就不如用冒泡
T ( n ) = c n 2 + 2 T ( n 2 ) T(n)=cn^2+2T(\frac{n}{2}) T(n)=cn2+2T(2n​)

求和为 ∑ k = 0 ∞ c ( n 2 k ) 2 ⋅ 2 k = c n 2 ∑ k = 0 ∞ 1 2 k \sum\limits_{k=0}^\infty c\left(\frac{n}{2^k}\right)^2\cdot 2^{k}=cn^2\sum\limits_{k=0}^\infty \frac{1}{2^k} k=0∑∞​c(2kn​)2⋅2k=cn2k=0∑∞​2k1​
等号右边级数显然收敛到一个常数,故为 O ( n 2 ) O(n^2) O(n2)。

原地归并排序算法的复杂度分析相关推荐

  1. 03.预备知识:算法的复杂度分析

    大家好,我是王有志.关注王有志,回复DSA获取数据结构和算法学习资源. 今天我们只有一个内容:算法的复杂度分析.算法的复杂度分析可以说是算法中的灵魂,有了它我们才能去评价一个算法优劣. 算法的评价标准 ...

  2. 【数据结构与算法】复杂度分析

    一.什么是复杂度分析? 1.数据结构和算法解决是"如何让计算机更快时间.更省空间的解决问题". 2.因此需从执行时间和占用空间两个维度来评估数据结构和算法的性能. 3.分别用时间复 ...

  3. 数据结构与算法分析c++第四版_数据结构与算法 - 时空复杂度分析

    这周主要总结了时间复杂度的学习,跟小伙伴们分享下,欢迎指正. 一.为何需要分析算法复杂度 挺多同学本科都学习过数据结构和算法这门课,但是有没有想过这门课到底是解决什么问题?科学家设计这些数据结构和算法 ...

  4. 3.算法的复杂度分析

    算法 **算法(Algorithm)**是对某一个或者某一类问题的解决方案的描述,根据问题的输入,在有限的计算时间里输出预期的结果.不同的算法解决问题所需的时间和空间可能会不同,通常用时间复杂度和空间 ...

  5. 在线算法与竞争度分析

    离线算法是指算法运行时可以充分利用输入数据之间完整的关联特性,即算法运行前所有输入数据均是已知的. 在线算法是指算法必须在输入数据不是完全可知的情况下,完成相应的计算并输出计算结果.在线算法均是近似算 ...

  6. python素数最优算法_几种简单的求素数算法的复杂度分析

    素数的算法有很多种,现在主要讲两种算法及其改进版本的复杂度分析,解释性能提升的幅度.同时应用一个素数定理:素数的平方一定是合数,那么在范围内最大数的开方范围内找不到能整除的数,那么这个数是素数.应用这 ...

  7. 社会名流问题算法详细复杂度分析

    题目 在n个人中,被所有人认识却不认识所有人的人,被称作社会名流(或称名人).若存在社会名流,则找出他.可以使用的唯一方法是询问:"请问你知道那个人吗?" 请给出提问次数为O(n) ...

  8. 各个排序算法的复杂度分析与复杂度介绍

    什么是复杂度 算法的时间复杂度和空间复杂度 算法的时间复杂度反映了程序执行时间随输入规模增长而增长的量级,在很大程度上能很好反映出算法的优劣与否. 空间复杂度:类似于时间复杂度的讨论,一个算法的空间复 ...

  9. 数据结构与算法_01_复杂度分析

    文章目录 记号 记号

最新文章

  1. 计算机图形学----基于3D图形开发技术 (韩正贤 著)
  2. [BTS06]BizTalk2006 SDK阅读笔记(九) 业务活动监控
  3. http响应最大时长 nginx_nginx反向代理时如何保持长连接
  4. 数据挖掘实践(金融风控)
  5. 安卓入门系列-08四大组件之Activity
  6. 计算机电源插头有哪几种,盘点电连接器常见的使用类型
  7. Linux中kobject的作用,Linux设备驱动模型-- 数据结构Kset/KObject
  8. python简单爬虫代码-一则python3的简单爬虫代码
  9. SPring cloud (3)A Ribbon 负载均衡 配置初步
  10. 第四次作业随笔(计算器第二步)
  11. 第三次作业代码规范修改
  12. iOS数据库的使用(二):sqlite教程
  13. PreferenceScreen的应用
  14. java定积分_记录一次定积分实现方法(java)
  15. 页面风格设定参考——色彩及其效
  16. 厦门大学计算机保研学校,厦门大学计算机科学系(专业学位)计算机技术保研夏令营...
  17. AcWing 2041. 干草堆
  18. 语音算法论文中frame-level,segment-level,utterance-level fearure
  19. ImageLoader和GridView小总结
  20. 苹果 iPhone12 信号差,到底是谁的锅

热门文章

  1. 蓝桥杯:栈 和 例题 :小邋遢的衣橱
  2. 物联网开发框架Niagara - Part1概述
  3. 大数据课程00——[基础篇]大数据学习入门
  4. linux数组拼接_JavaScript合并两个数组
  5. web前端学习笔记——JQuery
  6. mysql(while,repeat,loop) 循环语句的使用
  7. Android隐藏输入法键盘(hideSoftInputFromInputMethod没有效果)
  8. 程序员,读研你的优势是什么呢?
  9. Android mm编译
  10. Processing动图临摹与其拓展