【初赛】关于计数、基数和桶排序的一些区别

这篇博客主要介绍桶排序、计数排序和基数排序的工作原理及流程,并介绍其中的差别。
若是不想听博主的 废话 大段文字,可以跳到文末。

桶排序(Bucket sort)

桶排序的工作的原理是将数组分到 k k k 的桶里。
其工作流程为:

  1. 扫描一遍序列求出最大值 m a x V maxV maxV 和最小值 m i n V minV minV ,设桶的个数为 k k k ,则把区间 [ m i n V , m a x V ] [minV, maxV] [minV,maxV] 均匀划分成 k k k 个区间,每个区间就是一个桶。将序列中的元素分配到各自的桶。
  2. 对每个桶内的元素进行排序。可以选择任意一种排序算法。
  3. 将各个桶中的元素合并成一个大的有序序列。
  4. 举例来说,若是对每个桶使用快排(假设数据是均匀分布的,则每个桶的元素平均个数为 n/k),则单次排序复杂度为 O ( n / k ⋅ l o g 2 n / k ) O(n/k \cdot log_2n/k) O(n/klog2n/k),则总复杂度为 O ( n + k ⋅ n / k ⋅ l o g 2 n / k ) = O ( n + n l o g n − n l o g k ) O(n + k \cdot n/k\cdot log_2n/k) = O(n+nlogn-nlogk) O(n+kn/klog2n/k)=O(n+nlognnlogk)
    【初赛】关于计数、基数和桶排序的一些区别_第1张图片

总的来说,桶排序是将数据划分为 k k k 个桶,分别进行排序,其时间复杂度随着桶的数量( k k k)的增加而减少,趋向 O ( n ) O(n) O(n) ,但同时空间复杂度也会增加至 m a x V − m i n V maxV - minV maxVminV

性质
  • 平均时间复杂度:O(n + k)
  • 最佳时间复杂度:O(n + k)
  • 最差时间复杂度:O(n ^ 2)
  • 空间复杂度:O(k)
  • 稳定性:稳定

计数排序

简单来说,计数排序可以理解为一种特殊的桶排,即 k = n k = n k=n 的情况。
其工作流程为:

  1. 求出最大值 m a x V maxV maxV 和最小值 m i n V minV minV,开出 m a x V − m i n V maxV - minV maxVminV 大的空间,然后将元素一次放进桶中(其实就是一个数组,记录大小等于其下标的元素的个数)
  2. 依次按顺序取出元素
    【初赛】关于计数、基数和桶排序的一些区别_第2张图片
性质

k k k 为其值域范围

  • 平均时间复杂度:O(n + k)
  • 最佳时间复杂度:O(n + k)
  • 最差时间复杂度:O(n + k)
  • 空间复杂度:O(k)
  • 稳定性:稳定

基数排序

其核心思想为按位进行比较,从而达到排序的效果,附动图一张:
【初赛】关于计数、基数和桶排序的一些区别_第3张图片
若是想详细了解可以看这个:【初赛】基数排序

性质
  • 平均时间复杂度:O(n * k)
  • 空间复杂度:O(n + k)
  • 稳定性:稳定

总结

  1. 计数排序为特殊的桶排,其桶的个数 k = m a x V − m i n V k = maxV - minV k=maxVminV
  2. 基数排序是按位进行分割比较,进行计数排序或桶排(其本质便是按位进行多次桶排)
  3. 在复杂度和适用范围上,他们也不尽相同:

【初赛】关于计数、基数和桶排序的一些区别_第4张图片

你可能感兴趣的:(算法,数据结构)