数组中两类元素的稳定分离

时间:2010-05-25 17:12:09

标签: algorithm sorting in-place stable-sort

考虑以下问题。

我们得到一组属于两个类的元素:红色或蓝色。我们必须重新排列数组的元素,以便所有蓝色元素首先出现(并且所有红色元素都会出现)。必须以稳定的方式进行重新排列,这意味着必须保留蓝色元素的相对顺序(红色元素的相对顺序)。

是否有一个聪明的算法可以就地执行上述重新排列?

当然,非现场解决方案很简单。

一个明显的就地解决方案是将任何稳定的排序算法应用于数组。然而,在阵列上使用完整的排序算法直觉感觉就像是一种过度杀伤,特别是考虑到我们只处理两类元素这一事实。

任何想法都非常感激。

3 个答案:

答案 0 :(得分:6)

显然可以在O(n)时间和O(1)空间中进行。 Jyrki Katajainen撰写的论文Stable minimum space partitioning in linear time和Tomi Pasanen声称能够做到这一点。

Google稳定0-1排序。

答案 1 :(得分:1)

我不知道O(n)算法,但这是一种在最坏情况下具有O(n * log(n))复杂度的简单算法。也许它会有用。

从开头切断零,从最后切断零,它们已经在他们的位置。现在数组看起来像一个序列,后跟零序列,后跟一系列序列,依此类推,如下所示:1010101010

用第一个零序列交换第一个1序列,用第三个零序列交换第一个序列,依此类推。它将成为:0110011001

序列数量减少了约两倍。重复上述过程,直到对数组进行排序。

要交换两个相邻序列,将第一个序列与第一个相反,然后将它们反转。

答案 2 :(得分:1)

这在C ++中称为稳定分区,并且有一个标准算法:std::stable_partition

SGI实现具有自适应行为,具体取决于可用内存量:

  • 如果可以分配O(N)空间
  • ,它在O(N)中运行
  • 它在O(N log N)交换中运行

我想知道后一种解决方案是否在幕后使用稳定的排序算法。