【发布时间】:2012-03-03 02:08:49
【问题描述】:
好的,我有一个任务是使用几种不同的方法在列表中找到第 K 个最小的元素....
第一种方法是对列表进行排序,然后返回第 K 个最小的元素。简单,我的心态是说list=10个元素,把list升序排序,然后返回第10个位置的元素
下一个方法使用来自 Quicksort 的分区:
"第二种算法是应用快速排序中使用的过程 Partition。该过程对数组进行分区,以便所有小于某个枢轴项的元素在数组中位于它之前,所有大于该枢轴项的元素在其后它。枢轴项所在的槽称为枢轴位置。我们可以通过分区来解决选择问题,直到枢轴项位于第 k 个槽。如果k小于枢轴位置,我们通过递归分割左子数组来做到这一点,如果 k 大于枢轴位置,则递归分割右子数组。当 k = 枢轴位置时,我们就完成了。"
假设我有一个包含 10 个项目的列表:
3 8 9 2 4 5 1 7 10 6,以 5 为轴心。我知道我通常会有 2 个数组
3 2 4 1 和 8 9 7 10 6
但我不明白的是:“我们可以通过分区来解决选择问题,直到枢轴项目位于第 k 个插槽。”
第 k 个插槽是什么?对我来说,我一直在想 kth = 数组的长度,所以在这种情况下是 10。其中会有 6 个值,这显然不是最低的......而且不正确。
有人可以使用这个示例数组并告诉我这个算法的含义以及它如何找到第 k 个/最小的元素吗?谢谢
【问题讨论】:
-
您在中途重新定义了 k:第一个 k 是搜索元素的顺序(可能小于数组的长度,例如第二小的从 1 开始计数时,10 元素数组中的元素具有 k=2),然后您说 k 是数组的长度。 kth slot 就是数组中的第 k 个位置。
-
好吧,这消除了一些误解......但我仍然感到困惑。说我给出的示例数组,假设我想找到第三个最小的元素,并且枢轴始终是第一个项目。我想我不明白如何知道“什么”是数组之前的第三个最小元素是完全排序的?我想我只需要有人为我展示它,所以我明白......
-
我怎么知道 k 是小于还是大于枢轴位置?
-
这是基于的重要属性:快速排序的分区功能确保枢轴之前的所有元素都小于或等于枢轴(尽管不一定排序)并且枢轴之后的所有元素都大于枢轴(再次,不一定排序)。
-
我的意思是..我明白这一切。但我觉得我只能知道列表完全排序后的第 K 个最小元素是什么......
标签: java algorithm selection quicksort