惊!世界上竟然有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.界面设计很方便,设计中充分考虑到移动客户的使用习惯及喜好,设计 ...
随机推荐
- DTOJ 4027:挖煤
挖煤 [问题描述]众所周知, 小C是挖煤好手.今天他带着他的魔法镐子去挖煤 ,他的镐子一开始有$w$点魔力.他的挖煤 路线 上会依次 经过$n$个地点, 地点, 每个 地点是煤矿或者补给站,设小C当前 ...
- grep -r
今晚改脚本 我发现了一个很有趣的事情,一共56个配置文件 1 # 注意:对一些参数一致的多个文件可以用此方法 2 # grep -r 查找文件内容,其中PARALLEL=2就是我要替换的内容 3 4 ...
- linux下vi与vim区别以及vim的使用-------vim编辑时脚本高光显示语法
vi与vimvi编辑器是所有Unix及Linux系统下标准的编辑器,他就相当于windows系统中的记事本一样,它的强大不逊色于任何最新的文本编辑器.他是我们使用Linux系统不能缺少的工具.由于对U ...
- C#筛选项联动,联动筛选
protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { FillDep(); } // FillDG(); ...
- springcloud - alibaba - 3 - 整合config - 更新完毕
0.补充 1.需求 如果我有这么一个请求:我想要gitee中的配置改了之后,我程序yml中的配置也可以跟着相应产生变化,利用原生的方式怎么做?一般做法如下: 而有了SpringCloud-alibab ...
- Spark中的分区方法详解
转自:https://blog.csdn.net/dmy1115143060/article/details/82620715 一.Spark数据分区方式简要 在Spark中,RDD(Resilien ...
- org.apache.hadoop.hive.ql.metadata.HiveException: Internal Error: cannot generate all output rows for a Partition解决
自己在路径访问明细表开发时,写的sql如下 SELECT guid, sessionid, event['url'] as page, `timestamp` as ts, row_number() ...
- PLSQL导出oracle表结构和数据
1.导出表结构和数据 方式1.tools->export user objects是导出表结构 tools ->export user object 选择选项,导出.sql文件 说明:导出 ...
- [学习总结]3、Android---Scroller类(左右滑动效果常用的类)
参考资料:http://blog.csdn.net/vipzjyno1/article/details/24592591 非常感谢这个兄弟! 在android学习中,动作交互是软件中重要的一部分,其中 ...
- show processlist命令详解
1.show processlist; SHOW PROCESSLIST显示哪些线程正在运行.您也可以使用mysqladmin processlist语句得到此信息.如果您有SUPER权限,您可以看到 ...