【发布时间】:2019-08-07 19:38:47
【问题描述】:
我知道以前有人问过这个问题。我已经阅读了它们,但我仍然不确定我所解释的是否正确。
假设我们有一个 [51,20,26,16,19,38,10,37,49] 数组。
首先,我们必须选择中位数作为枢轴(第一个、最后一个和中间)。
[51,19,49]
因此,49 是支点,我们将它移到后面。
接下来,分区子数组[51,20,26,16,19,38,10,37]49。
由于 51 是大于 49 的 first 元素,而 37 是小于 49 的 first 元素,我们交换它们。
[37,20,26,16,19,38,10,51]
^ ^
重复相同的步骤。
由于 51 是第一个大于 49 但其索引大于 37 的元素,因此我们将枢轴换成 51。现在我们的数组如下所示:
[37,20,26,16,19,38,10,49,51]
现在 49 和 51 已排序。
然后,我们再次从[37,20,26,16,19,38,10] 中选择枢轴:[37,16,10]。
向后交换枢轴:
[37,20,26,10,19,38,16]
寻找大于 16 的元素:37
寻找小于 16 的元素:10
交换
[10,20,26,37,19,38,16]
寻找大于 16 的元素:20
寻找小于 16 的元素:10
由于索引为 20 > 索引为 10,我将用 20 交换枢轴
[10,16,26,37,19,38,20]
从这里开始,我将重复从找到中位数到分区的步骤。但是,我真的不确定这是否是正确的方法。抱歉,如果这是一篇冗长的文章,我试图尽可能具体地说明我的思考过程。谁能告诉我我的做法是否正确?
【问题讨论】:
-
"因为 51 是第一个大于 49 的元素,而 37 是第一个小于 49 的元素,我们交换它们。" -- 你不知道是不是这样,你只知道一个比枢轴大,另一个比枢轴小。此外,您接下来要做的是将它们放在两个单独的数组中,以便枢轴用作中间的元素。这两个序列存储在一个数组中是一个优化细节。顺便说一句:从您的描述中不清楚,但是您在分区中间没有切换枢轴。
-
这是否意味着在我第一次以
[37,20,26,16,19,38,10,49,51]结尾的分区之后,我应该再次从[37,19,51] 中选择中位数。因此,我的新中位数是 37,我从那里开始工作?
标签: algorithm data-structures quicksort