桶排序、基数排序

这一篇记录的是平均时间复杂度为 O(n) 的排序算法,包括桶排序、计数排序、基数排序。

桶排序

和其它的排序算法相比较,桶排序我感觉更像是一种思想。把待排序的数据放进 n 个桶里,在桶内进行排序,排序完成后再合并起来。对于桶内的排序来说,可以使用任何一个排序算法都可以,比如快速排序?

如果桶内排序使用的是快速排序,那么假设一个桶内有 k 个数据,一共有 km 个数据,也就是有 m 个桶。一个桶的时间复杂度为 O(klogk),m 个桶的时间复杂度就是 O(mklogk),而 k = n/m,所以就是 O(nlog n/m)。当 n 和 m 很接近时,logn/m 接近一个常量,所以可以看做时间复杂度为 o(n)。
还有一个特例,当 n 和 m 相等的时候,就成了计数排序,也就是一个数据对应一个桶,然后统计这个数出现的次数进行排序。

我放一张计数排序的动图算了,桶排序就是多了桶内排序这一步。

计数排序

基数排序

基数排序是基于只进行部分比较的排序算法。比如我们要比较两个人的年龄大小,首先肯定是先比较是哪一年的,然后再比较月份,日期。如果两个人不是同一年的,那就可以直接知道两个人的年龄谁大谁小了,不需要再比较后面。贴一张极客时间王铮的图。

基数排序

基数排序的前提是待排序的数据的位数要相同,如果不同的话,可以考虑补 0 ,或者使用其它的排序算法。

猜你喜欢

转载自www.cnblogs.com/beyondexp/p/12814034.html