我正在处理一些算法分配,并被问到以下问题:在 O(n) 中对一个数组进行排序,其中元素 'r' 或 'w' 就位,因此 'r' 总是在 'w' 之前。因此,如果输入看起来像 [w,r,w,r,w,r,w,w],则在算法运行后数组看起来像 [r,r,r,w,w,w,w,w] .
从概念上讲,这似乎很清楚。我必须使用两个边界变量来保存第一个“w”元素的位置,一个用于最后一个“r”元素。
我的代码如下所示:
char[] A = new char[] { 'w', 'r', 'w', 'r', 'w', 'r', 'w', 'w' };
int lastRedPosition = A.Length - 1;
int firstWhitePosition = 0;
for (int i = firstWhitePosition ; i < A.Length; i++)
{
// determine the first red from the right e.g. the lastred, ending at the firstwhite position
for (int j = lastRedPosition; j > firstWhitePosition; j--)
{
if (A[j] == 'r')
{
lastRedPosition = j;
break;
}
}
for (int k = firstWhitePosition; k < lastRedPosition; k++)
{
if (A[k] == 'w')
{
firstWhitePosition = k;
break;
}
}
A[firstWhitePosition] = 'r';
A[lastRedPosition] = 'w';
}
现在我认为它在 O(n) 中运行,直观地说,尽管嵌套了 for 循环。这是因为,总而言之,数组只被遍历一次。因为我们使用 lastRedPosition 和 firstWhitePosition 变量来跟踪我们的位置。
然而,我发现很难更正式地激励这一点,因为相同的嵌套 for 循环......有人可以给我一些指向正确directopm的指针吗?