桶排序
1、原理:
在比较排序的算法中,快速排序的性能最佳,时间复杂度是O(n*logn)
.因此,在使用比较排序时,时间复杂度的下限就是O(n*logn)
。而桶排序的时间复杂度是O(n+c)
,因为它的实现并不是基于比较实现的,而是基于映射函数
实现的。
桶排序工作的原理是将数组分到有限数量的桶子里。每个桶子再个别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排序)。
桶排序利用函数的映射关系,减少了几乎所有的比较工作。实际上,桶排序的f(k)值的计算,其作用就相当于快排中划分,已经把大量数据分割成了基本有序的数据块(桶)。然后只需要对桶中的少量数据做先进的比较排序即可。
2、基本思路
桶排序(Bucket Sort)的基本思路是:
将待排序元素划分到不同的桶。先扫描一遍序列求出最大值
max
和最小值min
,设桶的个数为m
,则把区间 [min, max] 均匀划分成 m 个区间,每个区间就是一个桶。将序列中的元素分配到各自的桶。对每个桶内的元素进行排序。可以选择任意一种排序算法。
将各个桶中的元素合并成一个大的有序序列。
3、时间复杂度和空间复杂度
对于n
个待排数据,m
个桶,平均每个桶[n/m]
个数据的桶排序平均时间复杂度为:
O(n)+O(m*(n/m)*log(n/m))=O(n+n*(logn-logm))=O(n+n*logn-n*logm)
当n = m时,即极限情况下每个桶只有一个数据时。桶排序的最好效率能够达到O(n)
。
空间复杂度:n个元素+m个桶
(n个元素归到m个桶中,还需要m长度表示每个桶)
O(n+m)
4、具体例子
详见 Maximum Gap
桶排序、计数排序和基数排序的区别联系
1、计数排序
2、基数排序
为什么时间复杂度为
O(n*d)
,空间复杂度为O(n+k)
?
k
为基数即代表k进制
d
为每个元素的位数,显然当k=2时,d最大,当k=所有元素最大值时,d最小
n
代表元素总个数
w[0,...n-1]
用来保存所有元素每一位上的数,每个元素均是0~k中的一个值
crr[0,..k]
保存所有元素每位上0-k出现的次数(每位上的排序采用计数排序)
比如:k=10 ,123位数为d=3,则时间复杂度为O(n*d)
,空间复杂度为O(n+k)