我正在寻找一种有效的算法来执行以下操作:给定N个项目的数组,以某种方式对它进行排序,以便项目以M个相等组进行排序,其中每个组是未排序,但组之间彼此排序(一个组中的所有元素都小于下一个组的任何元素)。部分排序为N个未排序组的有效算法
最简单的方法是对整个数组进行排序。但效率不高,特别是如果组数远远小于项目总数(例如,将100万项分为5组)。
目前我已经决定使用quickselect算法(具体来说,它是Floyd-Rivest variation)将数组排序为2个未分类的组,然后将其应用M-1次。一个显着的改进可能是采用分而治之的方法来快速选择,首先将数组分成两组,然后对每一组进行排序等等,直到我们有M组。一种泛化的unordered partial sorting问题。
但我有一种直觉,认为可能有一种更简单,更有效的方法解决问题。有什么我失踪?有任何想法吗?我需要在我的RBush JavaScript library(一种高效的R *树实现)中提高批量插入性能。
听起来很棒! – Mourner 2014-08-31 18:59:55
所以,如果我理解你是正确的,那么可以通过运行一个类似快速排队的传球(当你在双方递回而不是一侧)来找到所有排名的元素时,对吧?然后,您将对排序的元素进行排序,并在每个排序的元素索引上运行分区子例程,从而产生我需要的未排序组的数组? – Mourner 2014-08-31 19:04:22
@Mourner比这更简单。您可以在快速选择的底部找到排名的元素,但不需要它们。你只需要知道这些组是在左边还是右边。但是在查找排名元素的过程中,您已经为从一个点到另一个点的元素生成了很多数组的分区。在回来的路上,你知道每个分区应该进入哪些未排序的组。因此,您可以通过递归来查找排名的元素,并且在您将递归解决方案排除在外的情况下,将您正在寻找的组合在一起。 – btilly 2014-08-31 19:40:28