1 基数排序(Radix Sort)
基数排序是按照低位先排序,然后收集;再按照高位排序,然后再收集;依次类推,直到最高位。有时候有些属性是有优先级顺序的,先按低优先级排序,再按高优先级排序。最后的次序就是高优先级高的在前,高优先级相同的低优先级高的在前。
算法描述
- 取得数组中的最大数,并取得位数;
- arr为原始数组,从最低位开始取每个位组成radix数组;
- 对radix进行计数排序(利用计数排序适用于小范围数的特点)
动图演示
代码实现
def Radix_sort(nums):
if not nums: return []
_max = max(nums)
# 最大位数
maxDigit = len(str(_max))
bucketList = [[] for _ in range(10)]
# 从低位开始排序
div, mod = 1, 10
for i in range(maxDigit):
for num in nums:
bucketList[num % mod // div].append(num)
div *= 10
mod *= 10
idx = 0
for j in range(10):
for item in bucketList[j]:
nums[idx] = item
idx += 1
bucketList[j] = []
return nums
算法特性
- 时间复杂度(最好): O ( n ∗ k ) O(n*k) O(n∗k)
- 时间复杂度(最坏): O ( n ∗ k ) O(n*k) O(n∗k)
- 时间复杂度(平均): O ( n ∗ k ) O(n*k) O(n∗k)
- 空间复杂度: O ( n + k ) O(n+k) O(n+k)
- 稳定性:稳定
基数排序基于分别排序,分别收集,所以是稳定的。但基数排序的性能比桶排序要略差,每一次关键字的桶分配都需要O(n)的时间复杂度,而且分配之后得到新的关键字序列又需要O(n)的时间复杂度。假如待排数据可以分为d个关键字,则基数排序的时间复杂度将是 O ( d ∗ 2 n ) O(d* 2n) O(d∗2n) ,当然d要远远小于n,因此基本上还是线性级别的。基数排序的空间复杂度为 O ( n + k ) O(n+k) O(n+k),其中k为桶的数量。一般来说n>>k,因此额外空间需要大概n个左右。