zoukankan      html  css  js  c++  java
  • python实现线性排序-基数排序

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

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

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

  • 相关阅读:
    Python 异常处理
    汉语分词软件的使用 (python底下)
    谈谈python的文件处理——文件的输入与输出
    统计翻译系统中的开源工具们
    研究生如何选定课题方向 如何变学神
    口语翻译——AI过程的必经之路
    google的盈利模式
    机器翻译软件从实验室走向市场
    I'm Back
    jquery getJSON
  • 原文地址:https://www.cnblogs.com/dylancao/p/8269917.html
Copyright © 2011-2022 走看看