【问题标题】:How to convert the following non-stable sorting algorithm to stable?如何将以下非稳定排序算法转换为稳定?
【发布时间】:2014-09-02 03:10:54
【问题描述】:

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

【问题讨论】:

  • 如果 a 数组只包含卡片颜色,为什么不只计算它们,然后通过填充适当的值来重新创建数组?
  • @rostok 正如 OP 所建议的那样,这将不再存在。
  • 我们可以使用辅助内存吗?说一个数组?
  • 最简单的已知解决方案相当难看,而且 O(n log n) 时间的分治算法在当前硬件上可能会更快。

标签: algorithm sorting stable-sort


【解决方案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)

【讨论】:

    【解决方案2】:

    O(n2) 中的一种方法:

    a) 将每个元素的索引附加到元素本身。

    {"RED1","RED2","BLUE3","BLUE4"}

    b) 交换函数应该考虑最后一个字符,即 索引指示器,当您尝试交换两个 RED 或两个 BLUE 时。

    例如:当您尝试交换两个 RED 时 -> 仅在 indexOfFirst(RED) > indexOfSecond(RED) 时交换

    蓝色也一样。

    注意:您需要添加一些额外的逻辑来确定它是蓝色还是红色。

    【讨论】:

      【解决方案3】:

      计数排序

      如果你只有蓝色和红色 你在数蓝色元素和红色元素

      [b1 r1 r2 b2 b3 r3 r4 b4 r5]
      

      在 for 循环中你计算你的元素 你有blue: 4red: 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) 的更快方法,但在处理各种数据时会占用大量内存

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-06-16
        • 1970-01-01
        • 2011-06-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-16
        相关资源
        最近更新 更多