c++ - 使用快速排序观察二次行为 - O(n^2)

标签 c++ algorithm sorting complexity-theory quicksort

quicksort算法的平均时间复杂度为 O(n*log(n)),最坏情况复杂度为 O(n^2)。

假设 Hoare 快速排序算法的某些变体,什么样的输入会导致快速排序算法表现出最坏情况的复杂性?

请说明与特定快速排序算法(例如主元选择等)的实现细节相关的任何假设,或者它是否来自 libc 等常用库。

一些阅读:

  1. A Killer Adversary for Quicksort
  2. Quicksort Is Optimal
  3. Engineering a Sort Function
  4. Introspective Sorting and Selection Algorithms

最佳答案

Quick sort表现最差,即在 O(n^2) 时,当所选枢轴的所有值都是所采用集合的最大或最小值时。考虑这个例子。

1 2 3 4 5

枢轴选择为 1,枢轴右侧有 4 个元素,左侧没有元素。递归地应用相同的逻辑,选择的基准分别为 2、3、4、5,我们得到了这种排序在最坏可能时间执行的情况。

有人推荐并证明,如果输入打乱得很好,快速排序的性能会很好。

此外,排序的选择通常取决于对输入域的清晰了解。例如,如果输入很大,那么有一种称为外部排序的东西可能会使用外部存储器。如果输入大小非常小,我们可能会进行归并排序,但对于中型和大型输入集则不行,因为它会占用额外的内存。快速排序的主要优点是它的“就地”意义,输入数据不使用额外的内存。它在纸面上的最坏情况时间是 O(n^2) 但仍然被广泛首选和使用。我的观点是,可以根据对输入集的了解及其偏好来更改排序算法。

关于c++ - 使用快速排序观察二次行为 - O(n^2),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4708419/

相关文章:

c++ - QSslSocket等待数据时超时(但QTcpSocket不会)

c++ - C++ 线程问题

c - 优化数组求和(子集问题)

algorithm - 非常大的数模素数

c - 需要关于如何实现这个的帮助..选择一个最好的数据结构

c - C中的插入排序算法

c++ - 使用从文件读取的结构的函数没有返回输出?

c++ - 将带有静态回调参数的 C 函数包装到接受私有(private)成员作为回调的 C++ 函数

c - K&R 的 qsort() 实现中 swap(v, left, (left + right)/2) 的目的是什么?

ios - 按字母顺序排序 [NSDictionary allKeys]