这个排序这么酷,为什么知道的人很少?

开发 开发工具
有一种很神奇的排序,基数排序(Radix Sort),时间复杂度为O(n),今天花1分钟,通过几幅图,争取让大家搞懂细节。

有一种很神奇的排序,基数排序(Radix Sort),时间复杂度为O(n),今天花1分钟,通过几幅图,争取让大家搞懂细节。

画外音:居然还有时间复杂度为O(n)的排序算法?

不但有,其实还有很多。 举个栗子:

假设待排序的数组arr={72, 11, 82, 32, 44, 13, 17, 95, 54, 28, 79, 56}

基数排序的两个关键要点:

(1)基:被排序的元素的“个位”“十位”“百位”,暂且叫“基”,栗子中“基”的个数是2(个位和十位);画外音:来自野史,大神可帮忙修正。

(2)桶:“基”的每一位,都有一个取值范围,栗子中“基”的取值范围是0-9共10种,所以需要10个桶(bucket),来存放被排序的元素;

基数排序的算法步骤为:

  1. FOR (每一个基) { 
  2. //循环内,以某一个“基”为依据 
  3. 第一步:遍历数据集arr,将元素放入对应的桶bucket 
  4. 第二步:遍历桶bucket,将元素放回数据集arr 

更具体的,对应到上面的栗子,“基”有个位和十位,所以,FOR循环会执行两次。

第一次:以“个位”为依据。

画外音:上图中标红的部分,个位为“基”。

第一步:遍历数据集arr,将元素放入对应的桶bucket;

操作完成之后,各个桶会变成上面这个样子,即:个位数相同的元素,会在同一个桶里。

第二步:遍历桶bucket,将元素放回数据集arr;

画外音:需要注意,先入桶的元素要先出桶。

操作完成之后,数据集会变成上面这个样子,即:整体按照个位数排序了。

画外音:个位数小的在前面,个位数大的在后面。

第二次:以“十位”为依据。

画外音:上图中标红的部分,十位为“基”。

第一步:依然遍历数据集arr,将元素放入对应的桶bucket;

操作完成之后,各个桶会变成上面这个样子,即:十位数相同的元素,会在同一个桶里。

第二步:依然遍历桶bucket,将元素放回数据集arr;

操作完成之后,数据集会变成上面这个样子,即:整体按照十位数也排序了。

画外音:十位数小的在前面,十位数大的在后面。

首次按照个位从小到大,第二次按照十位从小到大,即:排序结束。

神奇不神奇!!!

几个小点:

(1)基的选取,可以先从个位开始,也可以先从十位开始,结果是一样的;

(2)基数排序,是一种稳定的排序;

(3)时间复杂度,可以认为是线性的O(n); 希望这一分钟,大家有收获。

【本文为51CTO专栏作者“58沈剑”原创稿件,转载请联系原作者】

戳这里,看该作者更多好文 

 

责任编辑:赵宁宁 来源: 51CTO专栏
相关推荐

2020-08-13 09:19:10

Kafka存储MQ

2018-10-28 15:40:23

Python编程语言

2023-11-02 10:22:29

gRPC后端通信

2023-04-26 07:06:56

CPU主板半导体器件

2024-01-02 10:38:22

Go语言数组

2021-10-08 15:52:19

电脑苹果Windows

2020-02-27 21:03:30

调度器架构效率

2022-06-13 21:52:02

CDN网络节点

2017-08-31 16:22:22

2018-08-16 08:03:21

Python语言解释器

2020-02-27 15:44:41

Nginx服务器反向代理

2024-02-26 21:15:20

Kafka缓存参数

2013-03-04 10:10:36

WebKit浏览器

2022-06-02 08:03:19

PyCharmPython代码

2019-08-30 14:58:47

JavaScript程序员编程语言

2023-10-08 08:36:03

2020-09-27 08:12:09

Nginx反向代理负载均衡

2017-01-23 13:08:46

大数据客户画像技术

2020-11-10 22:53:54

oracle数据库

2024-01-10 17:04:13

通信模块通信技术通信模组
点赞
收藏

51CTO技术栈公众号