博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
O(n)时间的排序
阅读量:6334 次
发布时间:2019-06-22

本文共 1116 字,大约阅读时间需要 3 分钟。

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

分析:排序是面试时经常被提及的一类题目,我们也熟悉其中很多种算法,诸如插入排序、归并排序、冒泡排序,快速排序等等。这些排序的算法,要么是O(n2)的,要么是O(nlogn)的。可是这道题竟然要求是O(n)的,这里面到底有什么玄机呢?

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

                由于年龄总共只有几十种可能,我们可以很方便地统计出每一个年龄里有多少名员工。举个简单的例子,假设总共有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)

转自:

转载地址:http://rjioa.baihongyu.com/

你可能感兴趣的文章
[公告]这里的博客将不再更新,最新博客请移步至blog.coderzh.com
查看>>
OSG程序设计之Hello World 2.0
查看>>
计算机网络之---物理层
查看>>
Jdk的java.util.concurrent包中已经实现了一个Semaphore类(信号量的用法),主要用于多线程情况下控制某个方法的并发数...
查看>>
[Axapta]"Journal name may not be changed when vouchers have been created"的问题
查看>>
2014025654《嵌入式系统程序设计》第二周学习总结
查看>>
三步学好Java,掌握Java编程思想
查看>>
获取windows版本信息的做法
查看>>
chrome developer tool—— 断点调试篇
查看>>
[100_Python学习笔记]001_Python环境安装配置(Windows 7)
查看>>
关于 platform的文章
查看>>
OC中自定义属性与系统属性冲突解决方法
查看>>
关于堆栈的详细讲解
查看>>
Kafka查看topic、consumer group状态命令
查看>>
Excel导出双sheet表格(poi)
查看>>
汇编实验三zxt
查看>>
oracle dblink使用
查看>>
A1006
查看>>
算法第四章上机实践报告
查看>>
程序员常见的编码和转义
查看>>