zoukankan      html  css  js  c++  java
  • Modified 2 color sort

    不知道原来的问题是怎么样子,修改后大概题意就是说有一个由0和1组成的数据要做到先在奇数位放置0,偶数位放置1,多出来的部分再放到最后边。有一个限制条件是原地地交换,也就是原则上不能使用额外空间(当然O(1)的变量还是可以用的)。

    比如说输入{0,1,1,0,1,1,0}就变换成{0,1,0,1,0,1,1}

    好的,没有现成算法,这种问题我喜欢。其实还是可以从其他算法中借鉴一些思想,还记得Knuth给的一个快排吗?

    eidx = 0; // even index

    oidx = 1; // odd index

    while (eidx < len && oidx < len)

    {

        while (eidx < len && array[eidx] == 1) eidx += 2;

        while (oidx < len && array[oidx] == 0) oidx += 2;

        if (eidx < len && oidx < len) swap(eidx, oidx);

    }

    if (eidx < len)

    {

        p = eidx;

        q = len & 0xFFFFFFFE;

        while (p < q)

        {

            while (p < q && array[p] == 1) p += 2;

            while (p < q && array[q] == 0) q -= 2;

            if (p < q) swap(p, q);

        }

    }

    else if (oidx < len)

    {

        // similar to above

    }

    时间复杂度O(n),空间复杂度O(1)

  • 相关阅读:
    4.3 DDL 数据类型
    Log4j的简要概述
    Eclipse/IDEA使用小技巧
    idea-生成key的Java代码
    Java8新特性--lamada详解
    JQuery基本语法
    EL与Velocity基本语法总结:
    RAF(RandomAccessFile)类
    Java篇-File类之常用操作
    Java篇-File类之创建删除
  • 原文地址:https://www.cnblogs.com/sunyongyue/p/1896730.html
Copyright © 2011-2022 走看看