返回

在 O(n) 时间内掌握排序算法:深入解析桶排序、计数排序和基数排序

后端

引子:
踏上排序算法的征途,线性排序脱颖而出,以其惊人的 O(n) 时间复杂度傲视群雄。本文将带领你深入探究桶排序、计数排序和基数排序这三大排序利器,揭开它们高效运作的奥秘,让你在排序的战场上游刃有余。

桶排序:
想象一个盛满球的桶,每个球代表一个待排序元素。我们将桶划分为若干个子桶,每个子桶负责容纳特定范围的元素。依次遍历元素,将它们分配到对应的子桶中,然后依次输出每个子桶中的元素即可完成排序。

计数排序:
如果待排序元素的范围已知,我们可以利用计数排序。创建一个数组记录每个元素出现的次数,再遍历该数组,累加元素出现的次数,即可获得元素的有序序列。

基数排序:
对于含有多个数字的元素(如整数),基数排序从最低位开始,逐位比较排序。将元素按最低位分组,然后再按第二低位分组,如此类推,直到所有位数都被考虑。

适用场景:

  • 桶排序: 元素分布均匀,范围已知时。
  • 计数排序: 元素范围较小,元素分布相对集中时。
  • 基数排序: 元素为多位数字时。

代码示例:

桶排序:

def bucket_sort(nums, num_buckets):
    buckets = [[] for _ in range(num_buckets)]
    for num in nums:
        buckets[num // num_buckets].append(num)
    sorted_nums = []
    for bucket in buckets:
        sorted_nums.extend(bucket)
    return sorted_nums

计数排序:

def counting_sort(nums, max_value):
    counts = [0] * (max_value + 1)
    for num in nums:
        counts[num] += 1
    sorted_nums = []
    for i in range(max_value + 1):
        sorted_nums.extend([i] * counts[i])
    return sorted_nums

基数排序:

def radix_sort(nums, num_digits):
    for i in range(num_digits):
        nums = counting_sort(nums, 10**i)
    return nums

结语:
桶排序、计数排序和基数排序这三驾马车为我们提供了应对各种排序场景的有力武器。理解它们的原理和适用场景,将使我们在算法竞技场上如鱼得水,所向披靡。愿这些排序利器助你化繁为简,在数据处理的疆域中纵横驰骋!