线性排序算法:桶排序和基数排序

0 前言

今天刷Leetcode的时候遇到一道题使用了基数排序,是一种线性时间的排序方法,感觉蛮有意思的,特地记录。

1 桶排序

桶排序的原理是这样:有时候我们只需要对整数排序,而且这些整数都有一个不大的上界M,于是我们使用一个大小为M的数组count,初始化为0,称count为一个有M个单元的桶。当读入一个数 A i A_i Ai时,令 c o u n t [ A i ] count[A_i] count[Ai]加1即可。读入所有数据之后,扫描count打印出数字即可。如下图所示,给学生分数排序时只需造一个M=100的桶,依次读入分数即可。
图源浙大陈越数据结构mooc
有兴趣的读者可以做这道题练习Leetcode1030题

2 基数排序

桶排序遇到的问题是有时候上界M很大,但是数组元素个数很少的话,这种算法很低效,比如[10000000,1]这样的数组。基数排序的出现就是解决这个问题的。基数排序的算法原理是这样的:从最低有效位开始进行桶排序,放入大小为10的桶里,如果最大的数是K的话就排K次。如下图所示,在第一次排序时,根据个位数将数字放到桶里;第二次排序时个位数的10位为0,则将他们放入0的桶,其余数字依据十位数放入各自的桶;第三次时根据百位按照第二次的思路排即可。
图源浙大陈越数据结构慕课
有兴趣的读者可以以这道题做练习Leetocde164题

3 总结

相比于我们熟悉的排序算法,如时间复杂度 O ( N 2 ) O(N^2) O(N2)的冒泡、插入排序和时间复杂度 O ( N L o g 2 N ) O(NLog_2N) O(NLog2N)的快排、归并,桶排序和基数排序的算法复杂度为 O ( N ) O(N) O(N),这是由于这两种算法并没有采取元素比较的策略。虽然高效,但是这两种算法只能用于整数排序,对于浮点数则无法使用。

猜你喜欢

转载自blog.csdn.net/MoonWisher_liang/article/details/110201223