关于快速排序算法最多比较次数与最少比较次数的问题

关于快速排序算法最多比较次数与最少比较次数的问题

最常见的快速排序算法的衡量标准是时间复杂度,即最坏情况 O(n) ,最优与平均情况均为 O(n log2n) 。最近看到一道题是关于快速排序最少以及最多比较次数的:

对 50 个整数进行快速排序需进行的关键码之间的比较次数可能达到的最大值和最小值分别是多少?

最好情况与最坏情况

快速排序的情况好坏取决于一趟划分后枢轴量的位置。枢轴量划分的越均匀就越好,越不均匀也就越差。

最大比较次数

最大比较次数出现在最坏情况,也就是初始序列完全有序的情况。这种情况下每次划分都是最不均匀的,即一边是零个另一边是全部。可以参考下面十个元素的例子,这种情况比较次数轻易可以看出是 1+2+3++(n1)=n(n1)2

003

最小比较次数

最小比较次数出现在最好情况,即每次枢轴量都可以完美均分序列(我称之为完美枢轴),即每一趟枢轴都会刚好在正中间,例如:

004

此种情况下不太好直接计算比较次数,可以使用递推的方法进行计算,如果我们把对 n 个元素进行快排的最小比较次数记为 best(n)。首先列出元情况,也就是 0 个元素和 1 个元素的情况:

best(0)=0best(1)=0

则可以利用公式

(1)best(n)=+best()+best()(2)=(n1) +best(n12)  +best(n2)

一步步递推下去:

best(2)=1+best(0)+best(1)=1best(3)=2+best(1)+best(1)=2best(4)=3+best(1)+best(2)=4

回归题目,对 50 个整数进行快速排序需进行的关键码之间的比较次数可能达到的最小值为:

(3)best(50)=49+best(24)+best(25)(4)=49+23+best(11)+best(12)+24+best(12)+best(12)(5)=49+23+24+best(11)+3×best(12)(6)=49+23+24+10+best(5)+best(5)+3×(11+best(5)+best(6))(7)=49+23+24+10+33+5×best(5)+3×best(6)(8)=49+23+24+10+33+5×(4+best(2)+best(2))+3×(5+best(2)+best(3))(9)=49+23+24+10+33+20+15+13×best(2)+3×best(3)(10)=49+23+24+10+33+20+15+13×best(2)+3×(2+best(1)+best(1))(11)=49+23+24+10+33+20+15+6+13×best(2)+6×best(1)(12)=49+23+24+10+33+20+15+6+13×1+6×0(13)=193

本文所用算法模拟网站:https://visualgo.net/zh/sorting

posted @   AncilunKiang  阅读(1821)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 【.NET】调用本地 Deepseek 模型
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
点击右上角即可分享
微信分享提示