五分钟学会一个有意思的排序:计数排序

2018-11-27 09:39:44 +08:00
 CoderOnePolo

由于 LeetCode 上的算法题很多涉及到一些基础的数据结构,为了更好的理解后续更新的一些复杂题目的动画,推出一个新系列 -----《图解数据结构》,主要使用动画来描述常见的数据结构和算法。本系列包括十大排序、堆、队列、树、并查集、图等等大概几十篇。

你可以在公众号 五分钟学算法 获取更多排序内容

计数排序

计数排序是一种非基于比较的排序算法,其空间复杂度和时间复杂度均为 O(n+k),其中 k 是整数的范围。基于比较的排序算法时间复杂度最小是 O(nlogn)的。该算法于 1954 年由 Harold H. Seward 提出。

计数排序的核心在于将输入的数据值转化为键存储在额外开辟的数组空间中。作为一种线性时间复杂度的排序,计数排序要求输入的数据必须是有确定范围的整数

算法步骤

  1. 花 O(n)的时间扫描一下整个序列 A,获取最小值 min 和最大值 max

  2. 开辟一块新的空间创建新的数组 B,长度为 ( max - min + 1)

  3. 数组 B 中 index 的元素记录的值是 A 中某元素出现的次数

  4. 最后输出目标整数序列,具体的逻辑是遍历数组 B,输出相应元素以及对应的个数

算法演示

排序动画过程解释

  1. 首先,扫描一下整个序列

  2. 获得最小值为 2,最大值为 7

  3. 新建数组包含 2~7 的元素

  4. 再次扫描序列,将序列的值放置在新建数组中

  5. 扫描数字 5,数组中 index 为 3 的值为 5,次数为 1

  6. 扫描数字 3,数组中 index 为 1 的值为 3,次数为 1

  7. 扫描数字 4,数组中 index 为 2 的值为 4,次数为 1

  8. 扫描数字 7,数组中 index 为 5 的值为 7,次数为 1

  9. 扫描数字 2,数组中 index 为 0 的值为 2,次数为 1

  10. 扫描数字 4,数组中 index 为 2 的值为 4,次数为 2

  11. 扫描数字 3,数组中 index 为 1 的值为 3,次数为 2

  12. 按照这种节奏,扫描结束后,新建数组中存放了整个序列以及每个数字出现的次数

  13. 最后输出目标整数序列

  14. 输出数字 2,同时数组中 index 为 0 的值为 2 的元素次数变为 0

  15. 输出数字 3,同时数组中 index 为 1 的值为 3 的元素次数变为 1

  16. 同样的操作,整个序列就完全输出了

代码实现

为了更好的让读者用自己熟悉的编程语言来理解动画,笔者将贴出多种编程语言的参考代码,代码全部来源于网上。

Go 代码实现

Java 代码实现

Python 代码实现

JavaScript 代码实现

如果你是 iOS 开发者,可以在 GitHub 上 https://github.com/MisterBooo/Play-With-Sort-OC 获取更直观可调试运行的源码。

你可以在公众号 五分钟学算法 获取更多排序内容

6904 次点击
所在节点    推广
33 条回复
TreStone
2018-11-27 10:08:30 +08:00
之前项目里一个排序使用了这个思想,现在终于知道她的名字了
fairyto2
2018-11-27 10:35:26 +08:00
桶排序
Exploreloop2
2018-11-27 10:35:55 +08:00
这个好像也叫桶排序?
co3site
2018-11-27 10:38:11 +08:00
就是桶排序嘛
mritd
2018-11-27 10:40:26 +08:00
不好意思 我们只会睡眠排序
stevenbipt
2018-11-27 11:02:14 +08:00
学算法导论有这个算法,不过那个写得比较简洁,被数组的[]弄得特别晕,不过慢慢调试看下来就发现本质了。
CoderOnePolo
2018-11-27 11:28:14 +08:00
@fairyto2 桶排序跟这个类似,区别在于桶排序是有个桶,里面是一些整数的范围区间
CoderOnePolo
2018-11-27 11:28:55 +08:00
@TreStone 这个有时候还是挺好用的
CoderOnePolo
2018-11-27 11:29:53 +08:00
@mritd 我今天正在写一篇名为 《不知道睡眠排序,还谈什么排序算法》 ^_^
CoderOnePolo
2018-11-27 11:30:36 +08:00
@stevenbipt 是呀,都得慢慢调试,我发现我做完动画后理解就更深刻了
hardman
2018-11-27 11:51:43 +08:00
我咋看着像桶排序
xiaohuangya
2018-11-27 13:05:43 +08:00
我记得有个网站也是可视化的讲排序,也有动画,蛮像的,可我不记得网址了(@_@;)
wasmir
2018-11-27 13:26:45 +08:00
CoderOnePolo
2018-11-27 14:13:45 +08:00
@wasmir
CoderOnePolo
2018-11-27 14:14:29 +08:00
@hardman 我后天更新一波桶排序,就可以发现区别了😂
rabbbit
2018-11-27 14:16:48 +08:00
这个动画不错,哪啥做的
rabbbit
2018-11-27 14:18:20 +08:00
哪 -> 拿
CoderOnePolo
2018-11-27 14:21:41 +08:00
@rabbbit 都是用 PPT 动画做的,其他的排序算法也用 PPT 动画做好了,感兴趣的话可以关注一下看看😂
xiaohuangya
2018-11-27 17:28:34 +08:00
@wasmir 是这个。
kljsandjb
2018-11-27 17:34:17 +08:00
桶子😂

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/511806

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX