Fork me on GitHub

  基数排序算法是一种是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。

由于整数也可以表达字符串(比如名字或日期)和特定格式的浮点数,所以基数排序也不是只能使用于整数。基数排序的发明

可以追溯到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

posted on 2018-01-11 18:18  虚生  阅读(742)  评论(0编辑  收藏  举报