代码实现
# radix_sort.py
from collections import deque
from typing import List
class Record:
def __init__(self, key):
self.key = deque(list(str(key)))
self.other_info = None
class Records:
def __init__(self, record_list: List[Record]):
self.record_list = deque([None])
self.record_list.extend(record_list)
self.record_len = len(self.record_list)-1
self.other_info = None
def distribute(records: Records, radix_queues, pos):
for i in range(1, records.record_len+1):
record = records.record_list[i]
x = record.key[pos]
radix_queues[int(x)].append(record)
records.record_list.clear()
records.record_list.append(None) # 只是为了下标从1开始,为了更好的说明问题
def collect(records, radix_queues):
for i in range(len(radix_queues)):
# 升序
records.record_list.extend(radix_queues.popleft())
radix_queues.append(deque()) # 为了保持radix_queues的长度保持不变
# 降序
# records.record_list.extend(radix_queues.pop())
# radix_queues.appendleft(deque())
def radix_sort(records: Records, decimal):
for i in range(1, records.record_len+1): # 对待排记录关键字转换成列表,以便于分配与收集
difference_value = decimal - len(records.record_list[i].key)
for j in range(difference_value):
records.record_list[i].key.appendleft('0')
radix_queues = deque([deque()]*10) # 10个分配列表
for i in range(decimal-1, -1, -1): # 进行分配收集操作
distribute(records, radix_queues, i)
collect(records, radix_queues)
for i in range(1, records.record_len + 1): # 对排好序的记录关键字序列转化成整数
records.record_list[i].key = int(''.join(records.record_list[i].key))
return records
# test_radix_sort.py
from radix_sort import Record, Records, radix_sort
records = Records([Record(key) for key in [48, 62, 39, 77, 55, 14, 35, 98]])
records = radix_sort(records, 2)
print([record.key for record in records.record_list if record])
"""
运行结果:
[14, 39, 35, 48, 55, 62, 77, 98]
Process finished with exit code 0
"""
[引用《数据结构–用C语言描述 耿国华版》]