关于快速排序算法最多比较次数与最少比较次数的问题
最常见的快速排序算法的衡量标准是时间复杂度,即最坏情况 O(n) ,最优与平均情况均为 O(n logn2) 。最近看到一道题是关于快速排序最少以及最多比较次数的:
对 50 个整数进行快速排序需进行的关键码之间的比较次数可能达到的最大值和最小值分别是多少?
最好情况与最坏情况
快速排序的情况好坏取决于一趟划分后枢轴量的位置。枢轴量划分的越均匀就越好,越不均匀也就越差。
最大比较次数
最大比较次数出现在最坏情况,也就是初始序列完全有序的情况。这种情况下每次划分都是最不均匀的,即一边是零个另一边是全部。可以参考下面十个元素的例子,这种情况比较次数轻易可以看出是 1+2+3+⋯+(n−1)=n(n−1)2 次
最小比较次数
最小比较次数出现在最好情况,即每次枢轴量都可以完美均分序列(我称之为完美枢轴),即每一趟枢轴都会刚好在正中间,例如:
此种情况下不太好直接计算比较次数,可以使用递推的方法进行计算,如果我们把对 n 个元素进行快排的最小比较次数记为 best(n)。首先列出元情况,也就是 0 个元素和 1 个元素的情况:
best(0)=0best(1)=0
则可以利用公式
best(n)=枢轴归位所需比较次数+best(枢轴归位后左半部分)+best(枢轴归位后右半部分)=(n−1) +best(⌊n−12⌋) +best(⌊n2⌋)(1)(2)
一步步递推下去:
best(2)=1+best(0)+best(1)=1best(3)=2+best(1)+best(1)=2best(4)=3+best(1)+best(2)=4…
回归题目,对 50 个整数进行快速排序需进行的关键码之间的比较次数可能达到的最小值为:
best(50)=49+best(24)+best(25)=49+23+best(11)+best(12)+24+best(12)+best(12)=49+23+24+best(11)+3×best(12)=49+23+24+10+best(5)+best(5)+3×(11+best(5)+best(6))=49+23+24+10+33+5×best(5)+3×best(6)=49+23+24+10+33+5×(4+best(2)+best(2))+3×(5+best(2)+best(3))=49+23+24+10+33+20+15+13×best(2)+3×best(3)=49+23+24+10+33+20+15+13×best(2)+3×(2+best(1)+best(1))=49+23+24+10+33+20+15+6+13×best(2)+6×best(1)=49+23+24+10+33+20+15+6+13×1+6×0=193(3)(4)(5)(6)(7)(8)(9)(10)(11)(12)(13)
本文所用算法模拟网站:https://visualgo.net/zh/sorting
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 【.NET】调用本地 Deepseek 模型
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库