考虑以下问题。
我们得到一组属于两个类的元素:红色或蓝色。我们必须重新排列数组的元素,以便所有蓝色元素首先出现(并且所有红色元素都会出现)。必须以稳定的方式进行重新排列,这意味着必须保留蓝色元素的相对顺序(红色元素的相对顺序)。
是否有一个聪明的算法可以就地执行上述重新排列?
当然,非现场解决方案很简单。
一个明显的就地解决方案是将任何稳定的排序算法应用于数组。然而,在阵列上使用完整的排序算法直觉感觉就像是一种过度杀伤,特别是考虑到我们只处理两类元素这一事实。
任何想法都非常感激。
答案 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实现具有自适应行为,具体取决于可用内存量:
我想知道后一种解决方案是否在幕后使用稳定的排序算法。