Python数据结构与算法——第五十五课 自然数字典式基数排序(本书结束篇)

  根据基数排序的原理,把自然数从个位开始按位储存到字典树(第四十二课)中,然后按层遍历,就输出排好序的列表了。

  程序代码(文本代码在附录1)

 

 

 

 

  运行结果:

 

 

  Python数据结构与算法》到处结束!谢谢您们的关注和陪伴!

 

  学思营编程课堂基于蓝桥STEM86平台https://www.stem86.com,开展学编程三部曲:

Scratch(三年级以前)>>>Python(四年级以后)>>>C++(七年级以后)教育实验活动,任何人可以免费参加,打开https://xuesiying.stem86.com网页注册进入课堂,也可关注本公众号留言。

更多课程请打开学思营同步网站:

http://www.5xstar.com/doc.html

 

参考资料:

1、《Python算法图解》何韬编著 清华大学出版社

 

附录1:

#通用字典式基数排序
#自然数id对象类
class IDData:
     #数据对象构造方法,id排序自然数
     def __init__(self, id):
         self.id = id    
#节点类
class RadixNode:
    def __init__(self):
        self.upRadixes = None  #高位节点
        self.valueList = None  #该节点的排序对象(IDData)列表
#自然数按位字典类
class RadixTree:
    #构造
    def __init__(self, radix=10):
        self.radix = radix  #进位制
        self.root = RadixNode()  #创建根节点,个位父节点
        self.root.upRadixes = [RadixNode() for i in range(radix)]  #创建个位桶
    #添加元素
    def add(self, idData):
        self.__add(self.root, idData.id, idData)  #调用递归方法
    def __add(self, father, id, idData):
        if id < self.radix:  #如果id小于进位制数
            node = father.upRadixes[id]  #该层节点
            if node.valueList == None:  #把对象加入该位列表
                node.valueList = [idData]
            else:
                node.valueList.append(idData)  
        else:  #如果id大于等于进位制数
            curId = id % self.radix  #当层数字
            node = father.upRadixes[curId]  #该层节点       
            if node.upRadixes == None:  #初始化上层
                node.upRadixes = [RadixNode() for i in range(self.radix)]
            id //= self.radix  #进位
            self.__add(node, id, idData)  #递归调用
    #逐层遍历,输出排序列表
    def radixSort(self):
        result = []  #结果表
        lst1 = [self.root]  #当层父节点
        lst2 = []  #当层节点收集器
        while len(lst1)>0:
            for father in lst1:  #遍历当层父节点
                nodes = father.upRadixes  #当层节点
                if nodes != None:  #当层节点不为空
                    for node in nodes:  #遍历当层节点
                        if node.valueList != None:  #如果数据对象列表非空,
                            result.extend(node.valueList)  #加入结果列表
                    lst2.extend(nodes)  #把当层节点加入当层节点收集器
            lst1 = lst2  #上推一层
            lst2 = []
        return result
#自然数组排序
def radixSort(arr, radix=10):
    rTree = RadixTree(radix)  #创建按位排序树
    for a in arr:  #加入元素
        rTree.add(IDData(a))
    rst = rTree.radixSort()  #输出结果
    return [rs.id for rs in rst]
#测试
if __name__ == "__main__":
    arr = [12,3,45,2543,214,1,10,4553,121]
    print(radixSort(arr))