首页 > 编程语言 >关于快速排序算法最多比较次数与最少比较次数的问题

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

时间:2023-01-09 10:45:06浏览次数:51  
标签:24 49 23 times 次数 排序 比较 best

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

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

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

最好情况与最坏情况

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

最大比较次数

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

003

最小比较次数

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

004

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

\[best(0) = 0\qquad best(1) = 0 \]

则可以利用公式

\[\begin{align} best(n) &= 枢轴归位所需比较次数 + best(枢轴归位后左半部分) + best(枢轴归位后右半部分)\\ &= \qquad(n-1) \qquad\ \quad+ \qquad best(\left\lfloor\frac{n-1}{2} \right\rfloor) \quad\ \ + \qquad best(\left\lfloor\frac{n}{2} \right\rfloor)\\ \end{align} \]

一步步递推下去:

\[best(2) = 1 + best(0) + best(1) = 1\\ best(3) = 2 + best(1) + best(1) = 2\\ best(4) = 3 + best(1) + best(2) = 4\\ \dots \]

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

\[\begin{align} best(50) &= 49 + best(24) + best(25)\\ &= 49 + 23 + best(11) + best(12) + 24 + best(12) + best(12) \\ &= 49 + 23 + 24 + best(11) + 3\times best(12)\\ &= 49 + 23 + 24 + 10 + best(5) + best(5) + 3\times (11 + best(5) + best(6))\\ &= 49 + 23 + 24 + 10 + 33 + 5\times best(5) + 3\times best(6)\\ &= 49 + 23 + 24 + 10 + 33 + 5\times(4 + best(2) + best(2)) + 3\times(5 + best(2) + best(3))\\ &= 49 + 23 + 24 + 10 + 33 + 20 + 15 + 13\times best(2) + 3\times best(3)\\ &= 49 + 23 + 24 + 10 + 33 + 20 + 15 + 13\times best(2) + 3\times(2 + best(1) + best(1))\\ &= 49 + 23 + 24 + 10 + 33 + 20 + 15 + 6 + 13\times best(2) + 6\times best(1)\\ &= 49 + 23 + 24 + 10 + 33 + 20 + 15 + 6 + 13\times 1 + 6\times 0\\ &=193 \end{align} \]

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

标签:24,49,23,times,次数,排序,比较,best
From: https://www.cnblogs.com/AncilunKiang/p/17036286.html

相关文章

  • 选择&冒泡&插入排序以及交换两数的三种方式
    选择排序//0~n位先排第0位的,将1~n的分别与0上的比较,如果小于它,交换//再排第1位,将2~n的分别与0上的比较,如果小于它,交换//以此类推publicstaticvoidselectSo......
  • 插入排序10-3
    ///<summary>///插入排序///从第2个数开始,跟第一个数对比,放在左边还是右边///循环下去比较,都放在合适的位置///</summary>///<paramname="arr"></param>publi......
  • 排序不等式
    排序不等式在刷acwing的时候碰到了一个,感觉还是挺新奇并且有用的一个东西  简记:顺序和(两者都是升序)>=乱序和>=逆序和证明的话就不证了,百度上都有来总结一下两个例题......
  • pta 6-5 折半插入排序
    将这一组数据分为有序组(有颜色的)和无序组(没有颜色的),数据的第一个元素默认为有序,如下:   将无序组中1号位置的数据进行拷贝,同时将1号位置收编到有序组序列中。此处将......
  • pta 6-3 快速排序
    这里用到了折半查找,原理快速排序类似折半查找,每轮会定义一个基准数值,对其它数值左右同时查找,将小于基准数值的数放在左边,大于的放在右边。初始无序数列:第一轮快速排序......
  • PHP中的排序函数sort、asort、rsort、krsort、ksort区别分析
    在php中自带了大量了数组排序函数,下面我们一一来介绍一下关于php数组排序的用法吧。sort()函数用于对数组单元从低到高进行排序。rsort()函数用于对数组单元从......
  • 冒泡排序算法
    基本原理比较相邻的元素。如果第一个比第二个大,就交换他们两个。对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。......
  • 冒泡排序,快速排序
        ......
  • 蓝桥杯——不就是几个排序嘛!
    一、前言时间过得真的好快,转眼间看到自己第一篇关于蓝桥杯的文章,已经过了7天了陆陆续续还好我在坚持学习算法的路上并不容易,但是其实不枯燥,还好吧。......
  • Object.keys()的默认排序
    constobj={'name':'张三','3':'ccc','a':'000','2':'222','1':'aaa'};Object.keys(obj);console.log(obj)["1","2","3","......