"""
基数排序:
基数排序是一种很特别的排序方法,它不是基于比较进行排序的算法,而是多关键字排序思想。借助‘分配’和‘收集’两种操作,
对单逻辑关键字进行排序。基数排序又分为最高位优先(MSD)排序和最低位优先(LSD)排序。
MSD:先从高位开始进行排序,对每个关键字,可采用计数排序
LSD:先从低位开始进行排序,对每个关键字,可采用桶排序
基本思路(以最低位优先排序为例):
1、待排序列表nums = [243, 75, 8]。取得集合的最大值:max_value = max(nums)
2、从最低位开始,依次进行个位、十位、百位、...排序。
以处理个位为例:采用散列函数思想,将nums列表中的元素映射到10个列表桶buckets中。
而元素存放的顺序是按个位上的数字由小到大排序。
3、这样从最低位排序一直到最高位排序完成以后, 数列就变成一个有序序列。
设待排序的数组R[1..n],数组中最大的数是d位数,基数为r=10
时间复杂度:O(d*(n+r))
空间复杂度:O(r*n)
"""
def radix_sort(nums):
# radix 基数
radix = 10
placement = 1
max_value = max(nums)
while placement < max_value:
# 采用散列函数思想,将nums列表中的元素映射到10个列表桶中。
buckets = [list() for _ in range(radix)]
for i in nums:
tmp = int((i / placement) % radix)
buckets[tmp].append(i)
# 将读取buckets中的值,依次更新nums[]
a = 0
for b in range(radix):
buck = buckets[b]
for i in buck:
nums[a] = i
a += 1
# placement数字权,更新placement到十位、百位、...
placement *= radix
return nums
if __name__ == '__main__':
nums = [234, 75, 8]
print(radix_sort(nums))