基数排序
分为两类:
第一类:最低位优先法,简称LSD法:先从最低位开始排序,再对次低位排序,直到对最高位排序后得到一个有序序列;具体过程如下图所示:
初始数组序列为:15,25,105,78,34,21,32,41,按照个位数大小依次入桶;
将桶中数依次倒出,对于同一个桶中的数按先进先出顺序倒出,结果为:21,41,32,34,15,25,105,78,再按十位数大小依次入桶;
将桶中数依次倒出,结果为:105,15,21,25,32,34,41,78,再按百位上数大小依次入桶,没有百位的数则按百位为0入桶;
将桶中数倒出,结果为:15,21,25,32,34,41,78,105
第二类:最高位优先法,简称MSD法:先从最高位开始排序,再逐个对各分组按次高位进行子排序,循环直到最低位。
仍以序列:15,25,105,78,34,21,32,41为例,从最高位百位依次入桶,只有105有百位,其他百位按0算;检测每个桶中的数据。当桶中的元素个数多于1个的时候,要对这个桶递归进行下一位的分组。
def RadixSort(List): Big=max(List) n=1 i=0 while 10**n<=Big: n+=1 while i<n: Digit={} j=0 for x in range(10): Digit.setdefault(x,[])#初始化字典的每个键值,如果x存在,则返回该键对应的值,否则返回为该键默认设置的[]。 '''for j in range(m): data=int(List[j]/10**i)%10 Digit[data].append(List(j)) ''' for x in List: data=int((x/(10**i))%10) Digit[data].append(x) for k in range(10): if Digit[k]!=None: for x in Digit[k]: List[j]=x j+=1 i+=1 return List if __name__=="__main__": a=[5, 4, 3, 1, 2, 7, 5, 15,9] d = RadixSort(a) print(d)
原文:https://blog.csdn.net/u011948899/article/details/78027838