预期的运行时间是 O(N) 大多数实现的最坏情况的运行时间是 O(N * N),因为大多数实现都使用 QuickSelect 并且可能是 QuickSelect 运行到错误的分区中。对于 Microsoft VS2008、VS2010 和 VS2012 来说也是如此。
现在有了新的 ISO C++ 2011 标准,std::sort 的复杂性得到了加强 - 它保证为 O(N * log N) 并且没有更坏的情况,因为使用了 David Musser 的 IntroSort: - 使用 QuickSort 并且如果阵列的一部分经历了糟糕的分区,交换到堆排序。
理想情况下,std::nth_element 应该完全相同,但 ISO C++ 2011 标准并未收紧复杂性要求。所以 std::nth_element 在最坏的情况下可能是 O(N * N) 。这可能是因为在 David Musser 的原始论文(请参阅此处)中,他没有提到如果 QuickSelect 出现问题应该换成什么算法。
在最坏的情况下,可以使用使用 5 组的中位数中位数(我看过一篇论文推荐的 7 组但找不到)。因此,如果分区出错,std::nth_element 的高质量实现可以使用 QuickSelect 并交换到中位数。这将保证 O(N) 行为。QuickSelect 可以通过使用抽样来改进,使最坏的情况不太可能发生但并非不可能。