考虑n个标记为红色或蓝色的卡片
i=1;
j=n;
while(i<n)
{
if(a[i]==RED)
i++;
if(a[j]==BLUE)
j--;
swap(a[i],a[j]);
}
如何使这个就地算法稳定我可以得到O(n ^ 2)问题的解决方案,任何人都可以提出O(n)解决方案吗?
答案 0 :(得分:1)
如果允许我们使用额外的内存,只需进行2遍扫描:
第一遍:
count = 0
foreach a[i] == RED
b[count ++] = a[i]
i ++
第二遍:
foreach a[i] == BLUE
b[count ++] = a[i]
i ++
最后复制a = b
总的来说,时间复杂度为O(3n) = O(n)
。
答案 1 :(得分:0)
O(n2)中的一种方法:
a)将每个元素的索引附加到元素本身。
{&#34; RED1&#34;&#34; RED2&#34;&#34; BLUE3&#34;&#34; BLUE4&#34;}
b)交换功能应考虑最后一个字符,即 索引指示器,当您尝试交换两个RED或两个蓝色时。
例如:当您尝试交换两个RED时 - &gt;如果indexOfFirst(RED)&gt;只交换indexOfSecond(RED)
蓝色的方式相同。
注意:您需要添加一些额外的逻辑来查找它是蓝色还是红色。
答案 2 :(得分:0)
计算排序
如果你只有蓝色和红色 你计算蓝色元素和红色元素
[b1 r1 r2 b2 b3 r3 r4 b4 r5]
并在for循环中计算你的元素
您有blue: 4
red: 5
然后你知道结果表是[ r r r r r b b b b]
你可以知道索引范围在哪里是红色元素和蓝色元素(最后一个红色元素是 {red_count} -1 ,最后一个蓝色元素是 {red_count} + {blue_count} -1 )将此值保存到redIndex和blueIndex
你创建了第二个表并在for循环中从搜索元素结束,最后一个是r5它的红色然后他的索引应该是4并且你减少redIndex
[b1 r1 r2 b2 b3 r3 r4 b4 __] blueIndex:8
[__ __ __ __ r5 __ __ __ __] redIndex:3
[b1 r1 r2 b2 b3 r3 r4 __ __] blueIndex:7
[__ __ __ __ r5 __ __ __ b4] redIndex:3
[b1 r1 r2 b2 b3 r3 __ __ __] blueIndex:7
[__ __ __ r4 r5 __ __ __ b4] redIndex:2
.....
对项目O(2n)进行排序的更快方法,但在各种数据时使用大量内存