算法 – 在数组中排列0和1

这是我最近遇到的面试问题之一。我想知道别人对这个问题的看法。

题:

您将得到一个结构,其中包含两个元素,即部门和字符串名称。

struct Employee
{ 
    string Name;
    int Dept;
}

您将获得N名员工的详细信息,其中N / 2名员工拥有Dept == 0,N / 2名员工Dept == 1,以任意顺序排列。您需要根据其Dept值对员工的详细信息进行排序,应为stable,即原始记录中的1和0的顺序应保持。

例如,给出以下示例数据:

Name         Dept

X1           0
X2           1
X3           0
X4           1
X5           0

排序结果后应该是:

Name         Dept

X2           1
X4           1
X1           0
X3           0
X5           0

该算法应该是稳定的,时间复杂度应该是O(N),其他变量的空间是恒定的(这意味着应该在现场进行排序)。

最佳答案
分配第二个阵列(O(N))。通过第一个数组迭代,并按照它们显示在第二个数组的顺序移动所有1。再次迭代,将0的相同顺序移动到第二个数组。所有操作O(N)。这不是原位(就地)解决方案。通过运行Quicksort分割算法一次获得非稳定的原位解。

在进行了一些研究之后,似乎没有任何额外的记忆的已知的O(N)解决方案是不稳定的。有关高效0-1稳定分选原位(到位)的学术研究,但解决方案需要一些额外的记忆。我不知道原来的问题陈述是否没有以准确的方式复制。没有稳定性要求,问题很简单;在没有原位要求的情况下也很容易。有了两个要求(原位,稳定),解决方案似乎是难以捉摸的。

在这里的答案中,有一个在O(N)中工作并且在原位的算法,但只有当关键字段为(1)可变且(2)可以包含整数而不是单个位时)。这是有效的,但不是原位0-1稳定排序,因为假定每个数组元素有可用的O(log N)可写内存。

转载注明原文:算法 – 在数组中排列0和1 - 代码日志