python算法学习之基数排序实例


Posted in Python onDecember 18, 2013

基数排序法又称桶子法(bucket sort)或bin sort,顾名思义,它是透过键值的部份资讯,将要排序的元素分配至某些"桶"中,藉以达到排序的作用,基数排序法是属于稳定性的排序,其时间复杂度为O (nlog(r)m),其中r为所采取的基数,而m为堆数,在某些时候,基数排序法的效率高于其它的比较性排序法。

# -*- coding: utf-8 -*-
def _counting_sort(A, i):
    """计数排序,以i位进行排序,以适用于基数排序。
    Args:
        A (Sequence): 排序数组
        i (int): 位数,从0开始而不是1
    """
    C = [0] * 10 # 任意位值范围为[0,9]
    A = [(a / (10 ** i) % 10, a) for a in A] # 元素i位值及其自身的元组的数组
    for k, a in A:
        C[k] = C[k] + 1
    for i in xrange(1, 10):
        C[i] = C[i] + C[i-1]
    B = [0] * len(A) # 结果数组
    for k, a in A[::-1]:
        B[C[k]-1] = a
        C[k] = C[k] - 1
    return B
def radix_sort(A, d):
    """基数排序,从最低位进行排序直到最高位:
    RADIX-SORT(A, d)
    1  for i ← 1 to d
    2    do use a stable sort to sort array A on digit i
    Args:
        A (Sequence): 排序数组
        d (int): 最大数位数
    """
    for i in xrange(d): # 遍历位数,从低到高
        A = _counting_sort(A, i)
    return A
def rsort(A, d):
    """基数排序(桶排序版本)"""
    for i in xrange(d): # 遍历位数,从低到高
        S = [[] for _ in xrange(10)] # 存放[0,9]位数值所对应元素([0-9]10个桶)
        for a in A: # 遍历元素
            S[a / (10 ** i) % 10].append(a) # 存放对应位数值的元素(元素当前位值在哪个桶就放进去)
        A = [a for b in S for a in b] # 以当前位数值排序好的A(依次从各桶里把元素拿出来)
    return A
if __name__ == '__main__':
    import random, timeit
    items = range(10000)
    random.shuffle(items)
    def test_sorted():
        print(items)
        sorted_items = sorted(items)
        print(sorted_items)
    def test_radix_sort():
        print(items)
        sorted_items = radix_sort(items, 4) # [0,9999],4位数
        print(sorted_items)
    test_methods = [test_sorted, test_radix_sort]
    for test in test_methods:
        name = test.__name__ # test.func_name
        t = timeit.Timer(name + '()', 'from __main__ import ' + name)
        print(name + ' takes time : %f' % t.timeit(1))
Python 相关文章推荐
Python实现建立SSH连接的方法
Jun 03 Python
详解使用python crontab设置linux定时任务
Dec 08 Python
python中pandas.DataFrame的简单操作方法(创建、索引、增添与删除)
Mar 12 Python
Python实现接受任意个数参数的函数方法
Apr 21 Python
python抓取网站的图片并下载到本地的方法
May 22 Python
windows下python和pip安装教程
May 25 Python
Python模拟登录的多种方法(四种)
Jun 01 Python
python中sys.argv函数精简概括
Jul 08 Python
numpy linalg模块的具体使用方法
May 26 Python
使用python 的matplotlib 画轨道实例
Jan 19 Python
Django Form常用功能及代码示例
Oct 13 Python
Python数据清洗工具之Numpy的基本操作
Apr 22 Python
python算法学习之桶排序算法实例(分块排序)
Dec 18 #Python
python计算最大优先级队列实例
Dec 18 #Python
python计算最小优先级队列代码分享
Dec 18 #Python
python查找第k小元素代码分享
Dec 18 #Python
python获取beautifulphoto随机某图片代码实例
Dec 18 #Python
python使用urllib2模块获取gravatar头像实例
Dec 18 #Python
python2.7删除文件夹和删除文件代码实例
Dec 18 #Python
You might like
php的$_FILES的临时储存文件与回收机制实测过程
2013/07/12 PHP
php while循环得到循环次数
2013/10/26 PHP
PHP生成自适应大小的缩略图类及使用方法分享
2014/05/06 PHP
PHP信号量基本用法实例详解
2016/02/12 PHP
PHP Class SoapClient not found解决方法
2018/01/20 PHP
在laravel框架中使用model层的方法
2019/10/08 PHP
JavaScript中URL编码函数代码
2011/01/11 Javascript
js循环改变div颜色具体方法
2013/06/25 Javascript
Javascript浮点数乘积运算出现多位小数的解决方法
2014/02/17 Javascript
JavaScript实现存储HTML字符串示例
2014/04/21 Javascript
js数组依据下标删除元素
2015/04/14 Javascript
基于jQuery+PHP+Mysql实现在线拍照和在线浏览照片
2015/09/06 Javascript
Vue.js使用v-show和v-if的注意事项
2016/12/13 Javascript
react-redux中connect()方法详细解析
2017/05/27 Javascript
详解vuejs之v-for列表渲染
2017/06/22 Javascript
vue音乐播放器插件vue-aplayer的配置及其使用实例详解
2017/07/10 Javascript
React Native react-navigation 导航使用详解
2017/12/01 Javascript
Vue-cropper 图片裁剪的基本原理及思路讲解
2018/04/17 Javascript
vue-router路由模式详解(小结)
2019/08/26 Javascript
webpack 动态批量加载文件的实现方法
2020/03/19 Javascript
vue大型项目之分模块运行/打包的实现
2020/09/21 Javascript
[38:40]2018DOTA2亚洲邀请赛 4.6淘汰赛 mineski vs LGD 第一场
2018/04/10 DOTA
Linux上安装Python的PIL和Pillow库处理图片的实例教程
2016/06/23 Python
python使用循环打印所有三位数水仙花数的实例
2018/11/13 Python
python numpy元素的区间查找方法
2018/11/14 Python
Python配置虚拟环境图文步骤
2019/05/20 Python
什么是python的函数体
2020/06/19 Python
Chain Reaction Cycles芬兰:世界上最大的在线自行车商店
2017/12/06 全球购物
Linux上比较文件的命令都有哪些
2013/09/28 面试题
项目经理的岗位职责
2013/11/23 职场文书
大学系主任推荐信范文
2013/12/24 职场文书
高三语文教学反思
2014/01/15 职场文书
中介业务员岗位职责
2014/04/09 职场文书
2014年房产经纪人工作总结
2014/12/08 职场文书
黑暗中的舞者观后感
2015/06/18 职场文书
教你如何用Python实现人脸识别(含源代码)
2021/06/23 Python