我们可以使用n logn最坏情况复杂度进行快速排序吗?

时间:2012-03-01 16:15:55

标签: algorithm sorting quicksort

我想知道我们是否能以某种方式修改快速排序算法以产生O(n logn)的最坏情况时间复杂度。虽然这可以通过置换数据然后假设我们将得到平均情况复杂度而不是最坏情况来完成。但这不是一个完整的证明解决方案,因为我们可以在置换后再次陷入最坏的情况。你还可以建议其他方法。

2 个答案:

答案 0 :(得分:15)

嗯,是的,我们可以把它归结为O(nlogn)。我所看到的所有尝试降低这些算法的算法都是基于选择您的支点。如果您可以“智能地”选择枢轴点,则可以将其关闭。

选项 1. Intro Sort。它现在不再是“纯粹的”快速排序。它稍后使用合并排序。 2.选择中位数作为支点。现在找到中位数可能会花费大量时间,如果以正常方式完成,但Introduction to Algorithms中有提及。

这是直接来自马的嘴Introduction to Algorithms

  1. 将数组划分为[n / 5]组,每组包含5个元素
  2. 使用插入排序查找每个组的中位数,然后从此列表中选择中位数
  3. 然后你需要递归尝试找出每组计算的[n / 5]中位数的中位数。
  4. 围绕此中位数对数组进行分区
  5. 我隐藏了这个算法中有一些更复杂的东西。如果你愿意,你可以在同一本书中阅读。通常,我不会尝试使用此算法。我使用随机选择操作来找到枢轴并继续使用它。

答案 1 :(得分:1)

这里“修改”是一个相当主观的词。您可以通过多种方式扩充快速排序,使其在O(n log n)中运行。你是否仍然可以称之为快速排序是有待确定的。

其中一个是introsort。 Introsort以快速排序开始,但随后切换到具有最坏情况复杂度O(n log n)的合并排序。内省的目的之一是打击3个中位数的杀手名单。