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

  • 相关阅读:
    JAVA NIO之文件通道
    Java NIO之缓冲区
    LinkedList 源码分析(JDK 1.8)
    ArrayList 源码详细分析
    自己动手实现一个简单的JSON解析器
    科普:String hashCode 方法为什么选择数字31作为乘子
    LinkedHashMap 源码详细分析(JDK1.8)
    HashMap 源码详细分析(JDK1.8)
    python创建目录
    python3 内置方法 字符串转换为字典
  • 原文地址:https://www.cnblogs.com/dylancao/p/8269917.html
Copyright © 2011-2022 走看看