O(n)时间的排序

简介: 题目:某公司有几万名员工,请完成一个时间复杂度为O(n)的算法对该公司员工的年龄作排序,可使用O(1)的辅助空间。        题目特别强调是对一个公司的员工的年龄作排序。员工的数目虽然有几万人,但这几万员工的年龄却只有几十种可能。

 

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

 

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

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

 

       想明白了这种思路,我们就可以写出如下代码:

 

void SortAges(int ages[], int length)
{
    if(ages == NULL || length <= 0)
        return;

    const int oldestAge = 99;
    int timesOfAge[oldestAge + 1];

    for(int i = 0; i <= oldestAge; ++ i)
        timesOfAge[i] = 0;

    for(int i = 0; i < length; ++ i)
    {
        int age = ages[i];
        if(age < 0 || age > oldestAge)
            throw new std::exception("age out of range.");

        ++ timesOfAge[age];
    }

    int index = 0;
    for(int i = 0; i <= oldestAge; ++ i)
    {
        for(int j = 0; j < timesOfAge[i]; ++ j)
        {
            ages[index] = i;
            ++ index;
        }
    }
}

 

 在上面的代码中,允许的范围是099岁。数组timesOfAge用来统计每个年龄出现的次数。某个年龄出现了多少次,就在数组ages里设置几次该年龄。这样就相当于给数组ages排序了。该方法用长度100的整数数组辅助空间换来了O(n)的时间效率。由于不管对多少人的年龄作排序,辅助数组的长度是固定的100个整数,因此它的空间复杂度是个常数,即O(1)

 

 

img_e00999465d1c2c1b02df587a3ec9c13d.jpg
微信公众号: 猿人谷
如果您认为阅读这篇博客让您有些收获,不妨点击一下右下角的【推荐】
如果您希望与我交流互动,欢迎关注微信公众号
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。

目录
相关文章
|
5天前
|
机器学习/深度学习 算法 搜索推荐
技术心得记录:常见的比较排序
技术心得记录:常见的比较排序
|
2月前
|
SQL 前端开发
区间时间检索
区间时间检索
9 0
|
2月前
|
算法 前端开发
按照频率将数组升序排序
按照频率将数组升序排序
18 0
|
2月前
|
C++
按照频率将数组升序排序(C++)
按照频率将数组升序排序(C++)
16 0
|
8月前
|
SQL
判断两个时间段交集、时间重叠问题
判断两个时间段范围是否有交集(时间重叠)问题经常遇到,比如预约会议室开会,活动的开始结束等,本文做此分析。
205 0
|
12月前
|
JavaScript
uniapp 按时间排序当前以后七天时间
uniapp 按时间排序当前以后七天时间
158 1
Typecho按文章发布时间倒序排序
Typecho的默认文章编辑排序方式是按照文章发布的时间来排序的,所以说默认的情况下,越早发布的文章会在首页的越后面,假如我们想要更改排序方式,即越早发布的文章排序在首页越前面的话,应该如何修改Typecho源代码呢?
276 2
Typecho按文章发布时间倒序排序
使用lambda去重、map排序、按任意时间间隔(小时、半小时、分钟)进行结果统计
使用lambda去重、map排序、按任意时间间隔(小时、半小时、分钟)进行结果统计
224 0
使用lambda去重、map排序、按任意时间间隔(小时、半小时、分钟)进行结果统计
ES实现“小于XX时间”排前面(或后面)“大于XX时间”排后面(或前面)排序
ES实现“小于XX时间”排前面(或后面)“大于XX时间”排后面(或前面)排序
ES实现“小于XX时间”排前面(或后面)“大于XX时间”排后面(或前面)排序
|
SQL 关系型数据库 MySQL
MYSQL查询近一年 近一月 近一周 今天数据 没有数据返回0 按时间有序返回数据
MYSQL查询近一年 近一月 近一周 今天数据 没有数据返回0 按时间有序返回数据
603 0
MYSQL查询近一年 近一月 近一周 今天数据 没有数据返回0 按时间有序返回数据