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

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

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

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

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

转载于:https://blog.51cto.com/10541556/1831301

算法复杂度为O(N) 的排序算法相关推荐

  1. 排序算法,最全的10大排序算法详解(Sort Algorithm)

    文章目录 排序算法,最全的10大排序算法详解(Sort Algorithm) 排序算法分类 排序算法稳定性 时间复杂度(time complexity) 1#时间复杂度的意义 2#基本操作执行次数 如 ...

  2. 【每日算法】C语言8大经典排序算法(2)

    接上文--->[每日算法]C语言8大经典排序算法(1) 二.插入类排序 插入排序(Insertion Sort)的基本思想是:每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子文件中 ...

  3. c语言排序算法 应用与实现,基于C语言排序算法改进与应用.doc

    基于C语言排序算法改进与应用 基于C语言排序算法改进与应用 摘 要:介绍了程序语言中排序的原理及应用,阐述了基于C语言的三种主要排序方法,提出了每种排序方法的改进,计算出改进后算法的时间复杂度,编写了 ...

  4. 算法设计与分析——十大经典排序算法二(6--10)

    一个不知名大学生,江湖人称菜狗 original author: jacky Li Email : 3435673055@qq.com  Time of completion:2023.3.1 Las ...

  5. java array 元素的位置_数据结构与算法:动态图解十大经典排序算法(含JAVA代码实现)...

    点击上方"JAVA",星标公众号 重磅干货,第一时间送达 本文将采取动态图+文字描述+正确的java代码实现来讲解以下十大排序算法: 冒泡排序 选择排序 插入排序 希尔排序 归并排 ...

  6. 【算法】动图展示八大常用排序算法,一次看个够!

    本文介绍常见的八大排序算法:直接插入排序.希尔排序.选择排序.堆排序.冒泡排序.快排.归并排序以及计数排序 文章内容很干,也很长,不过有多种动图图解,希望可以给枯燥的算法学习带来一抹亮色! 如果对于复 ...

  7. 常见排序算法_解释的算法-它们是什么以及常见的排序算法

    常见排序算法 In its most basic form, an algorithm is a set of detailed step-by-step instructions to comple ...

  8. 算法设计和数据结构学习_2(常见排序算法思想)

    一般约定我们是按照从小到大的顺序排序. 按照向量的形式来参考排序中数组元素的相对位置,行向量中最左边为数组的第一个元素,且称为前面.列向量中最上面的元素为数组的第一个元素,也是称为前边. 对常见的排序 ...

  9. 数据结构与算法一览(树、图、排序算法、搜索算法等)- Review

    算法基础简介 - OI Wiki (oi-wiki.org) 文章目录 1. 数据结构介绍 1.1 什么是数据结构 1.2 数据结构分类 2. 链表.栈.队列:略 3. 哈希表:略 4. 树 4.1 ...

最新文章

  1. Java - 死锁 Dead Lock 定位分析
  2. 十七、“秦时山洞汉时水,水长山高不止息。”(2021.5.17)
  3. Hi Table定义未来电视!祝贺海信发布S7社交电视! ​
  4. 碎片时间学习前端,我推荐这些~
  5. Flink SQL 功能解密系列 —— 流式 TopN 挑战与实现
  6. Vue调试神器vue-devtools - 插件下载安装
  7. 数据结构与算法(七) 栈以及栈的应用
  8. react项目开发问题整理
  9. mysql添加mcafee 审计插件
  10. 拓端tecdat|Stata估算观测数据的风险比
  11. 产品经理|竞品分析(附《竞品分析报告》模板)
  12. smart3d加载到谷歌_到底什么是Google Smart Lock?
  13. Note8 android 9 root,三星Note8国行 root N9500 9.0 root
  14. 快速使用注解方式实现aop切面编程
  15. 基于AT89C52单片机秒表设计
  16. 微信获取粉丝信息php,1.2 微信粉丝用户及粉丝标签管理
  17. MySQL-运维工具 pt-archiver数据归档工具
  18. 权威DNS、递归DNS以及DNS相关排名
  19. 360p2刷无线打印服务器,360P2路由器怎么修改无线信道?-360安全路由P2的WiFi信道修改教程?...
  20. 比特率 波特率 数据传输速率 区别

热门文章

  1. 网络工程:3.1 RIP(Routing Information Protocol)协议
  2. 组合数学--约瑟夫环问题 Josephus
  3. Docker新手入门:基本用法
  4. 表单的get和post使用情景
  5. chrome web store的信息
  6. MAC 下配置JavaEE开发环境
  7. Java—List的用法与实例详解
  8. 检测字符串包含emoji表情
  9. React基础学习(第二天)
  10. h5-plus.webview