O(n)时间的排序

简介:

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

 

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

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

 

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

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
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://www.cnblogs.com/heyonggang/p/3424879.html,如需转载请自行联系原作者

目录
相关文章
|
Shell Linux C语言
【Shell 命令集合 磁盘管理 】Linux 改变当前工作目录 cd命令使用指南
【Shell 命令集合 磁盘管理 】Linux 改变当前工作目录 cd命令使用指南
484 0
|
数据采集 JSON 移动开发
【实战】使用 uniapp 开发一个面试刷题小程序
直至 5 月也依然是互联网寒冬,大厂裁员的消息在微信群漫天飞舞,而招聘网站上的 HC 也越来也少,因此不少小厂也开始纷纷内卷,压低员工绩效,本应该晋级加薪的时间,也变成了杳无音信。难道我们就束手无策了
1959 0
|
8月前
|
安全 编译器 程序员
C++ noexcept 关键字的关键作用
`noexcept` 关键字在 C++ 中扮演着重要角色,通过正确使用 `noexcept`,可以提升程序的性能、增强代码的可读性和安全性,并且有助于编译器进行优化。在编写 C++ 代码时,应仔细考虑每个函数是否应该声明为 `noexcept`,以充分利用这一特性带来的优势。通过本文的介绍,希望开发者能够更好地理解和应用 `noexcept` 关键字,从而编写出更加高效、健壮的 C++ 程序。
255 8
|
9月前
|
算法
基于爬山法MPPT最大功率跟踪算法的光伏发电系统simulink建模与仿真
本课题基于爬山法MPPT算法,对光伏发电系统进行Simulink建模与仿真。使用MATLAB2022a版本,通过调整光伏电池的工作状态以实现最大功率输出。爬山法通过逐步优化工作点,确保光伏系统在不同条件下均能接近最大功率点。仿真结果显示该方法的有效性,验证了模型的正确性和可行性。
|
10月前
|
测试技术 持续交付 数据安全/隐私保护
软件测试的艺术与科学:探索自动化测试框架
在软件开发的世界中,测试是确保产品质量的关键环节。本文将深入探讨自动化测试框架的重要性和实现方法,旨在为读者揭示如何通过自动化测试提升软件测试效率和准确性。我们将从测试的基本概念出发,逐步引导读者了解自动化测试框架的设计和实施过程,以及如何选择合适的工具来支持测试活动。文章不仅提供理论知识,还将分享实用的代码示例,帮助读者将理论应用于实践。无论你是测试新手还是经验丰富的开发者,这篇文章都将为你打开一扇通往更高效、更可靠软件测试的大门。
148 1
|
11月前
|
开发框架 移动开发 Dart
Flutter 框架的缺点
以上缺点并不意味着 Flutter 框架不优秀,只是在使用过程中需要开发者根据具体的项目需求和场景,充分考虑这些因素,并采取相应的措施来克服或缓解这些问题,以充分发挥 Flutter 的优势,开发出高质量的移动应用。
|
人工智能 自然语言处理 安全
无影上新,AI助手晓颖来了!
无影上新,AI助手晓颖来了!
638 2
|
传感器 人工智能 安全
未来智能家居中的人工智能技术应用与发展
智能家居正逐步走向普及,其背后的关键技术——人工智能(AI),正在不断演进和应用。本文将探讨人工智能在智能家居中的重要性、现有技术的应用和未来的发展方向,以及其对用户生活带来的实际影响。 【7月更文挑战第12天】
651 5
|
机器学习/深度学习 人工智能 算法
|
JavaScript 编译器 开发者
uniapp复选框自定义样式&data数据与style交互
uniapp复选框自定义样式&data数据与style交互
267 0