• O(N)时间的排序


    题目:某公司有几万名员工,请完成一个时间复杂度为O(n)的算法对该公司员工的年龄作排序,可使用O(1)的辅助空间。

      要注意分析题目,一般排序要么是O(n^2),要么是O(nlogn)。但这里题目特别强调是对一个公司的员工的年龄作排序。员工的数目虽然有几万人,但这几万员工的年龄却只有几十种可能。上班早的人一般也要等到将近二十岁才上班,一般人再晚到了六七十岁也不得不退休。

      由于年龄总共只有几十种可能,我们可以很方便地统计出每一个年龄里有多少名员工。举个简单的例子,假设总共有5个员工,他们的年龄分别是2524262425。我们统计出他们的年龄,24岁的有两个,25岁的也有两个,26岁的一个。那么我们根据年龄排序的结果就是:2424252526,即在表示年龄的数组里写出两个24、两个25和一个26

    代码如下:

     1 void sortAge(int ages[],int length)
     2 {
     3     //  要学会考虑全面
     4     if(ages==NULL || length<=0)
     5         return ;
     6     const int oldAge = 99;
     7     int age[oldAge+1];
     8 
     9     //  尽量多用++i的形式
    10     for(int i=0;i<=length;++i)
    11     {
    12         int ageIn = ages[i];
    13         ++age[ageIn];
    14     }
    15     int index =0;
    16     for(int i=0;i<=oldAge;++i)
    17     {
    18         for(int j=0;j<age[i];++j)
    19         {
    20             ages[index] = i;
    21             ++index;
    22         }
    23     }
    24 }

    要辅助空间为O(1)的意思不是说用大小为1的空间,而是说辅助的空间是常量,不随着输入N变大而变大由于不管对多少人的年龄作排序,辅助数组的长度是固定的100个整数,因此它的空间复杂度是个常数,即O(1)

    原文请参考http://zhedahht.blog.163.com/。

  • 相关阅读:
    上传并压缩图片
    C#使用一般处理程序(ashx)中session
    cookie记住用户名密码
    操作数组
    鼠标滚轮事件兼容写法
    table嵌套table,jquery获取tr个数
    网站性能调优实战-学相伴KuangStudy
    为什么fdisk分区第一个分区以63或者2048扇区开始?
    oracle分组查询,获取组内所有信息(拼接显式)
    oracle中对象类型搜集(object type)
  • 原文地址:https://www.cnblogs.com/balingybj/p/4508824.html
Copyright © 2020-2023  润新知