c++ - 如何进行三个快速排序中位数的最坏情况排列

标签 c++ algorithm sorting data-structures

<分区>

我知道快速排序的时间复杂度。但我想知道如何创建最坏情况排列。

我想有一个规则可以做到。我真的想了很多,但对我来说太难了。

请告诉我如何为三个快速排序的中位数创建最坏情况,而不仅仅是普通快速排序。 (例如,如果枢轴是列表中最左侧的项目,则列表的最坏情况排列是排序列表,但是枢轴是三的中位数怎么样?)

here is my quick sort algorithm code

最佳答案

不幸的是,没有通用的答案,因为这取决于“三的中位数”部分的实现方式,以及“分区”步骤的实现方式。通过给它们提供大量完全相同的元素,许多人很容易陷入最坏的情况。但对于更有趣的情况,一般概念是这样的。

你从数字 1....N 和一个“相同大小的未知数组开始。你还不知道哪个数字在哪个索引中。

  1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,15,16,17,18,19,20
[ A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T]

快速排序的最坏情况是选择的主元尽可能靠近一端,因此您希望将三个元素中最大(或最小)的三个元素考虑为中位数。通常(但不总是!)第一个、中间和最后一个元素。

  1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,15,16,17
[19, B, C, D, E, F, G, H, I,18, K, L, M, N, O, P, Q, R, S,20]

现在我们知道,在分区步骤之后,数组可能看起来像这样,这取决于分区的实现方式:

[ S, B, C, D, E, F, G, H, I,18, K, L, M, N, O, P, Q, R,19,20]
                                                       ^ pivot

然后它将递归到 [18-R] 小节。 (它可能会也可能不会在 [20] 小节上另外递归,但我们在那里无能为力。因此我们重复该模式,将接下来的两个最大元素粘贴在剩下的末尾和中间:

[16, B, C, D, E, F, G, H,15,18, K, L, M, N, O, P, Q,17]

所以在分区之后它看起来像:

[ P, B, C, D, E, F, G, H,15, Q, K, L, M, N, O,16,18,17]
                                               ^ pivot

然后我们继续处理下一小节:

[ P, B, C, D, E, F, G, H,15, Q, K, L, M, N, O]

请注意,当我们填充“最大”元素时,我们会将数组位置(字母)替换为数字。完成后,我们将知道每个数组位置中的数字。到目前为止,我有这个:

[19, B, C, D, E, F, G, H,15,18, K, L, M, N, O, P, Q,17,19,20]

不幸的是,正如我所提到的,这在很大程度上取决于如何选择枢轴以及如何实现分区。可能存在一个您可以填写的简单模式,但我不知道它会是什么。您还会注意到,我一直将前三名的中位数放在最左边,因为这使得大多数分区实现的行为更加相似,但实际上,如果您知道分区的工作原理,最好将中位数放在最左边其他两个可能位置之一的前三名,只是为了再给它一个交换。

关于c++ - 如何进行三个快速排序中位数的最坏情况排列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23919017/

相关文章:

c++ - ifstream、ofstream 和 fstream 之间有什么区别?

C++ iostream 无法正常工作

c++ - 无法在 C++ 中打开文件

c++ - 你如何制作一个参数为 "size-aware"的函数?

python - 理解和可视化递归

algorithm - 有人可以举例说明二维码图像生成/编码算法吗?

c - Top N 记录排序以仅返回排序数组中特定范围内的数字

c# - 排序章节内容,如 14.1.2.3 和 14.10.1.2.3.4

c - 循环携带的依赖性(如果存在的话)在哪里?

algorithm - 出于好奇 : How are serial numbers generated? 提示,算法?