基数排序算法是一种是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。
由于整数也可以表达字符串(比如名字或日期)和特定格式的浮点数,所以基数排序也不是只能使用于整数。基数排序的发明
可以追溯到1887年赫尔曼·何乐礼在打孔卡片制表机(Tabulation Machine)上的贡献。
它是这样实现的:将所有待比较数值(正整数)统一为同样的数位长度,数位较短的数前面补零。然后,从最低位开始,
依次进行一次排序。这样从最低位排序一直到最高位排序完成以后,数列就变成一个有序序列。
基数排序的方式可以采用LSD(Least significant digital)或MSD(Most significant digital),LSD的排序方式由键值的最
右边开始,而MSD则相反,由键值的最左边开始。
其实,基数排序算法在百科上已经说得很明白了,我这里主要是为了使用python对它进行实现,一方面是为了温习算法,另外
一方面为了温习很久没用的python。
下面的是Python的两种代码实现:
#!/usr/bin/env python #encoding=utf-8 import math def sort(a, radix=10): """a为整数列表, radix为基数""" K = int(math.ceil(math.log(max(a)+1, radix))) # 用K位数可表示任意整数 bucket = [[] for i in range(radix)] # 不能用 [[]]*radix for i in range(1, K+1): # K次循环 for val in a: bucket[val%(radix**i)/(radix**(i-1))].append(val) # 獲得整數第K位數字 (從低到高) del a[:] for each in bucket: a.extend(each) # 桶合并 bucket = [[] for i in range(radix)] a_list = [54,26,93,17,77,31,44,55,20] sort(a_list) print a_list
import random def radixSort(lists): k = len(str(max(lists))) # k获取最大位数 for k in range(k): # 遍历位数,从低到高 s=[[] for i in range(10)] # 生成存放数的十个桶 for i in lists: # 遍历元素 s[i//(10**k)%10].append(i) #分桶 lists=[a for b in s for a in b] # 合并桶 return lists L = [random.randint(1,99999) for i in range(100001)] # 十万个随机数 print(radixSort(L))
以上两个是常用的python基数排序代码,这个有几个问题还是要搞清楚的。
参考文档: https://zh.wikipedia.org/wiki/%E5%9F%BA%E6%95%B0%E6%8E%92%E5%BA%8F
作者:虚生 出处:https://www.cnblogs.com/dylancao/ 以音频和传感器算法为核心的智能可穿戴产品解决方案提供商 ,提供可穿戴智能软硬件解决方案的设计,开发和咨询服务。 勾搭热线:邮箱:1173496664@qq.com weixin:18019245820 市场技术对接群:347609188 |