Arrays 就地将项目排序为段

Arrays 就地将项目排序为段,arrays,algorithm,sorting,parallel-processing,Arrays,Algorithm,Sorting,Parallel Processing,我有一个T类型的n项目数组,以及一个分类函数f(T),它为每个项目分配一个类别号,从O到k-1。(k为类别数)。 目标是将数组划分为k段,每个类别一个,并重新排列项目,使它们都位于正确的段中 使用两个不同的输入和输出数组,我可以在O(n)中完成,但我需要就地完成(即使用交换作为基本操作),如果可能,还需要使用可并行化算法 一个想法是一段接一段地做(首先将所有0在开始[O,i0]时交换到一个段上,然后将所有1(在i0之后开始)交换到一个新段上,以此类推)。这将是O(n*k)(随着n变小),但不可并

我有一个T类型的n项目数组,以及一个分类函数f(T),它为每个项目分配一个类别号,从O到k-1。(k为类别数)。 目标是将数组划分为k段,每个类别一个,并重新排列项目,使它们都位于正确的段中

使用两个不同的输入和输出数组,我可以在O(n)中完成,但我需要就地完成(即使用交换作为基本操作),如果可能,还需要使用可并行化算法

一个想法是一段接一段地做(首先将所有0在开始[O,i0]时交换到一个段上,然后将所有1(在i0之后开始)交换到一个新段上,以此类推)。这将是O(n*k)(随着n变小),但不可并行

另一种方法是在O(nlogn)中使用可并行化的排序算法,但这可能不是最佳的,因为大多数项的比较是相等的


我的问题是什么是解决这个问题的好方法,以及这个问题在文献中是如何被称为的?

简单地说,这个问题与。在这个问题中,您有一个包含三种不同颜色(红色、白色和蓝色)的球的数组,目标是对元素进行重新排序,使其排序为红色、白色和蓝色

利用荷兰国旗问题的想法,我认为你可以相对有效地解决这个问题。例如,您可能希望使用专门设计用于处理重复元素的快速排序变体。例如,专门设计用于处理存在大量重复键的输入,并进行快速排序,其中分区方案将元素分为三个组(小于键的元素、大于键的元素和等于键的元素),然后只对“较小”和“较大”组进行排序。如果一个数组中只有k个不同的值,那么运行时将是O(n log k),因为每个递归调用都将在一个子数组中进行,其中包含大约一半的不同键。这不是O(n),但它确实可以正常工作,并且并行化非常好(让不同的线程处理每个子阵列)。

这里有一个部分副本(不讨论并行化):。并行化的一种方法是将其拆分为多个部分;安排每件作品;然后就地并行合并(最后一个不是O(n)),希望能给你一些搜索键。