惊!世界上竟然有O(N)时间复杂度的排序算法!计数排序!
啥?你以为排序算法的时间复杂度最快也只能O(N*log(N))了?
O(N)时间复杂度的排序算法听说过没有?计数排序!!它是世界上最快最简单的算法!!!
计数排序算法操作起来只有三步,看完秒懂!
- 根据待排序集合中最大元素和最小元素的差值范围确定申请的桶个数;
- 遍历待排序集合,将每一个元素统计到对应的桶中;(此步完成后每个桶里面的数字代表了此桶对应元素出现的次数。)
- 从小到大遍历一遍所有桶,如果桶中有元素,那么就往排序结果里添加上对应个数的该桶对应的元素。
举个例子就明白了,假设已知所有待排序数字范围都在0~10,现在给了待排序的数组[5, 3, 5, 2, 8]。那么:
- 申请
0~10共11个桶用于放元素。 - 遍历待排序的数组
[5, 3, 5, 2, 8],把对应的桶里面放入小旗子,即 2、3、8 桶各放了一个旗子, 5 桶里放了两个旗子。 - 从 0 到 11 遍历一遍所有的桶,如果桶里没有小旗子就跳过,有小旗子就往结果里放入小旗子个数的该元素。得到
[2, 3, 5, 5, 8]。
是不是超级简单!
时间复杂度:数据取值范围是常数 M,待排序元素个数是 N,总的时间复杂度是 O(M + N) = O(N)!我们只把每个待排序的数字访问了一遍,所以是O(N)!
啥?你问我那 M 呢?M 是题目告诉你的数据取值范围呀,是个常数,和你要解决的问题规模无关!
空间复杂度:由于我们申请了大小为 M 的桶来放元素,所以空间复杂度是 O(M)。
啥?你问我那 N 呢?申请了 N 个空间用来存储要返回的结果,这个空间不算入空间复杂度!
既然计数排序的时间复杂度是 O(N) 那我们为啥不都使用计数排序呢?答案是只有当数字取值规模确定并且比较小的时候才能用呀,如果不知道取值规模或者取值规模太大,就不可以申请出那么多桶了呦~
本题告诉了取值范围是-50000 <= A[i] <= 50000,所以直接申请 100000 个桶就好了!
我们每个桶的下标是从 0 开始的,但是A[i]最小能取到 -50000,所以把 A[i] 映射到桶的下标的时候需要 + 50000;最后根据桶里面的元素放入到结果数组的时候要把桶的下标 - 50000还原成 A[i]。
我使用的C++代码作为演示。
class Solution {
public:
vector<int> sortArray(vector<int>& nums) {
int N = nums.size();
vector<int> counter(100010, 0);
for (int n : nums) {
counter[n + 50000] ++;
}
vector<int> res;
for (int i = 0; i < 100010; ++i) {
if (counter[i] != 0) {
res.insert(res.end(), counter[i], i - 50000);
}
}
return res;
}
};
欢迎关注负雪明烛的刷题博客,刷题800多,每道都记录了写法!
力扣每日一题活动建群啦,一起监督和讨论,我自建监督网址:http://group.ojeveryday.com/#/check,加入方式可以在监督网址中看到。
惊!世界上竟然有O(N)时间复杂度的排序算法!计数排序!的更多相关文章
- 一种O(n)时间复杂度的计数排序算法和Top N热词算法
排序算法是研究非常广泛且超级经典的算法,主流排序算法的时间复杂度基本都在O(nlogn). 今天就介绍一种以hash表为基础的,时间复杂度能够达到O(n)的排序算法--计数排序: 同时基于它的思想,完 ...
- 十大排序算法时间复杂度 All In One
十大排序算法时间复杂度 All In One 排序算法时间复杂度 排序算法对比 Big O O(n) O(n*log(n)) O(n^2) 冒泡排序 选择排序 插入排序 快速排序 归并排序 基数排序 ...
- Nivo Slider - 世界上最棒的 jQuery 图片轮播插件
Nivo Slider 号称世界上最棒的图片轮播插件,有独立的 jQuery 插件和 WordPress 插件两个版本.目前下载量已经突破 1,800,000 次!jQuery 独立版本的插件主要有如 ...
- Hacker - 世界上第一个黑客
http://juliet.iteye.com/blog/176525凯文·米特尼克,1964年生于美国加州的洛杉矶. 13岁时他对电脑着了迷,掌握了丰富的计算机知识和高超的操作技能,但却因为用学校的 ...
- 为什么我会认为SAP是世界上最好用最牛逼的ERP系统,没有之一?
为什么我认为SAP是世界上最好用最牛逼的ERP系统,没有之一?玩过QAD.Tiptop.用友等产品,深深觉得SAP是贵的有道理! 一套好的ERP系统,不仅能够最大程度承接适配企业的管理和业务流程,在技 ...
- 世界上不存在什么RedBSD,SuseBSD或者ArchBSD,Turb...
世界上不存在什么RedBSD,SuseBSD或者ArchBSD,TurboBSD之类的东西.
- hdu---(4515)小Q系列故事——世界上最遥远的距离(模拟题)
小Q系列故事——世界上最遥远的距离 Time Limit: 500/200 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)T ...
- Git是目前世界上最先进的分布式版本控制系统
一:Git是什么? Git是目前世界上最先进的分布式版本控制系统. 二:SVN与Git的最主要的区别? SVN是集中式版本控制系统,版本库是集中放在中央服务器的,而干活的时候,用的都是自己的电脑,所以 ...
- 世界上最方便的SharePoint移动客户端--Rshare
Rshare我试用了一段时间,同时也测试了其他家产品,使用后的感觉是Rshare无愧于世界上最方面的SharePoint移动客户端. 1.界面设计很方便,设计中充分考虑到移动客户的使用习惯及喜好,设计 ...
随机推荐
- Excel-单条件和多条件匹配搜索
6.[单条件匹配搜索]有两个表格(姓名列,年龄列,收入列等),从表1总表中,把表2中人员的年龄和收入匹配出来: 方法一: 公式=VLOOKUP($S2,$O$2:$Q$5,2,0) #其中最后0< ...
- 普通用户iptables规则持久化,开机自动恢复
本文档对于docker环境下并不适用,docker环境的iptables持久化请参考https://www.cnblogs.com/wiseo/p/15000745.html 添加iptables规则 ...
- Spring Boot 热启动插件
1. maven依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId ...
- CAN总线常见的两种编码格式(Intel/Motorola)
在汽车电子行业的开发或者测试中,我们经常会看到CAN总线信号的常见的两种编码格式:Intel格式与Motorola格式. 讲解这两种格式之前,我们先来了解一些大端模式和小端模式,会对后面理解这两种编码 ...
- A Child's History of England.17
CHAPTER 6 ENGLAND UNDER HAROLD HAREFOOT, HARDICANUTE, AND EDWARD THE CONFESSOR Canute left three son ...
- 单体内置对象 Global 和 Math
单体内置对象 Global 和 Math 在所有代码执行前,作用域中就已经存在两个内置对象:Global(全局)和Math.在大多数ES实现中都不能直接访问Global对象.不过,WEB浏览器实现了承 ...
- hashtable深度探索
1.什么是哈希表(hashtable)?为什么要发明哈希表? 首先回答第二个问题,在之前的数据结构中我们学习了数组,链表,二叉树等数据结构,记录在结构中的相对位置是随机的,和记录的关键字之前不存在确定 ...
- Oracle中的null与空字符串''的区别
含义解释:问:什么是NULL?答:在我们不知道具体有什么数据的时候,也即未知,可以用NULL,我们称它为空,ORACLE中,含有空值的表列长度为零.ORACLE允许任何一种数据类型的字段为空,除了以下 ...
- ListView的item不能点击(焦点冲突问题)
一般这种问题就是item里面有checkbox或button之类抢占焦点的控件,解决方案有2种: 第一种:就是在checkbox或button添加android:focusable="fal ...
- Maven pom.xml报错解决
用Maven建了一个web工程,总是在pom.xml头的地方报错: 大概是: Original error: Could not transfer artifact org.hamcrest:hamc ...