• 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

  • 相关阅读:
    XMIND
    android studio 更新 Gradle错误解决方法
    解决下载Android Build-tools 19.1.0失败
    Android Studio怎么删除项目
    android studio 更改背景和设置字体大小
    IOS开发常用技术网站
    Gitbook安装
    深入解析AsyncTask(转)
    Android中Bitmap和Drawable(转)
    提高Android在eclipse下的编译速度
  • 原文地址:https://www.cnblogs.com/dylancao/p/8269917.html
Copyright © 2020-2023  润新知