排序算法——桶排序简介

算法思想

桶排序是计数排序的改进,计数排序申请的额外空间跨度从最小元素值到最大元素值,若待排序集合中元素不是依次递增的,则必然有空间浪费情况。桶排序则是弱化了这种浪费情况,假设待排序的一组数均匀独立地分布在一个范围内,不再是为最小值和最大值之间的每一个位置申请空间,而是为最小值和最大值之间每一个固定大小的区间申请空间,尽量减少元素值大小不连续情况下的空间浪费情况。
也可以说计数排序是一类特殊的桶排序,是每个桶只存储相同的元素时的桶排序。

一句话总结桶排序:划分为多个范围相同的区间,每个区间自排序,最后合并。

桶排序的过程

桶排序的思想近乎彻底的分治思想

  1. 设置一个大小为 k k k 的定量的数组作为空桶,根据待排序元素的范围以及映射函数来确定桶的数量。
  2. 遍历待排序集合,将每一个元素使用映射规则映射到相应的桶中。
  3. 对每一个非空桶中元素进行排序。
  4. 最后将不是空的桶中排好序的数据拼接起来。

桶排序的高效与否的关键就在于这个映射函数的确定。为了使桶排序更加高效,我们需要做到以下几点:

  • 在额外空间充足的情况下,尽量增大桶的数量 k k k
  • 使用的映射规则能够将待排序元素均匀地分配到所有的桶中。

也就是说桶排序的关键就是建桶,如果桶建的不好的话桶排序几乎是没有作用的。
桶排序可以采用取待排序元素的最大值和最小值然后均分作桶。


图来自https://blog.csdn.net/qq_37186247/article/details/100834916

桶排序的代价

平均时间复杂度为 O ( n + k ) O(n+k) O(n+k)
最佳时间复杂度为 O ( n + k ) O(n+k) O(n+k)
最差时间复杂度为 O ( n 2 ) O(n^2) O(n2)

采用数组加链表的方式,空间复杂度为 O ( n + k ) O(n+k) O(n+k)

即使输入数据不服从均匀分布,桶排序也仍然可以线性时间内完成。只要输入数据满足下列性质:所有桶的大小的平方与总的元素数呈线性关系,那么桶排序就能在线性时间完成。

桶排序的时间复杂度取决于对各个桶之间数据进行排序的时间复杂度,因为其他部分的时间都是 O ( n ) O(n) O(n)。很显然,桶划分的越细,各个桶内的数据就越少,排序所用的时间也会越少,但是相应的空间消耗就会变大。

桶排序的稳定性

桶排序的稳定性取决于每个桶内排序多采取的算法的稳定性。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值