📜  商-余数排序(1)

📅  最后修改于: 2023-12-03 15:07:32.401000             🧑  作者: Mango

商-余数排序

商-余数排序(商排序或Radix sort)是一种根据数字中的不同位数来排序的算法。它通过将数字分成商和余数两部分,然后以余数为依据排序,重复这个过程直到所有位数都使用过为止。商-余数排序可以适用于基于数字的数据集合。

原理
  • 商-余数排序的实现方法,是先提取待排序元素的最低位(也称最右边)的有效数字,根据这一位数字进行一次排序。然后再考虑次低位数字,对所有元素在这一位上的数字进行排序......最后考虑最高位数字,进行排序后就完成了对所有元素的排序。
思路
  • 对于每一位进行排序,可以使用桶排序、计数排序或基数排序。

  • 先将基数从最低位开始比较并排序,再进行更高位的排序,直至所有的位数都比较完。

伪代码
radix-sort(A, d) // d表示最高位数,A为数组

for i = 1 to d
  do using stable-sort to sort array A on digit i
end for
代码实现
def radix_sort(nums):
    digit = 0
    max_digit = max(nums)
    while max_digit:
        max_digit //= 10
        digit += 1
    for i in range(1, digit+1):
        bucket_list = [[] for _ in range(10)]
        for j in range(len(nums)):
            bucket_list[nums[j]//(10**(i-1)) % 10].append(nums[j])
        nums.clear()
        for j in range(10):
            nums += bucket_list[j]
    return nums
时间复杂度
  • 最好时间复杂度:O(n*k)

  • 最坏时间复杂度:O(n*k)

  • 平均时间复杂度:O(n*k)

其中k是关键字基数(一般为10),n是数组长度。

稳定性
  • 具有稳定性。