如何将以下非稳定排序算法转换为稳定?

时间:2014-09-01 15:58:38

标签: algorithm sorting stable-sort

考虑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)解决方案吗?

3 个答案:

答案 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)进行排序的更快方法,但在各种数据时使用大量内存