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检查序列seq是否含有aset中项的方法
Jun 30 Python
Python简单格式化时间的方法【strftime函数】
Sep 18 Python
Python比较2个时间大小的实现方法
Apr 10 Python
Python随机生成身份证号码及校验功能
Dec 04 Python
在Pycharm中执行scrapy命令的方法
Jan 16 Python
Python实现html转换为pdf报告(生成pdf报告)功能示例
May 04 Python
基于Python函数和变量名解析
Jul 19 Python
详解Python利用random生成一个列表内的随机数
Aug 21 Python
python TK库简单应用(实时显示子进程输出)
Oct 29 Python
Jupyter notebook 启动闪退问题的解决
Apr 13 Python
Python基于requests实现模拟上传文件
Apr 21 Python
Python pandas 列转行操作详解(类似hive中explode方法)
May 18 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算开始时间到过期时间的相隔的天数
2011/01/12 PHP
PHP中使用gettext来支持多语言的方法
2011/05/02 PHP
WordPress中限制非管理员用户在文章后只能评论一次
2015/12/31 PHP
pjblog中的UBBCode.js
2007/04/25 Javascript
js和html5实现手机端刮刮卡抽奖效果完美兼容android/IOS
2013/11/18 Javascript
JS取文本框中最小值的简单实例
2013/11/29 Javascript
jquery 合并内容相同的单元格(示例代码)
2013/12/13 Javascript
jquery中html、val与text三者属性取值的联系与区别介绍
2013/12/29 Javascript
jquery删除提示框弹出是否删除对话框
2014/01/07 Javascript
extjs_02_grid显示本地数据、显示跨域数据
2014/06/23 Javascript
JavaScript字符串对象substr方法入门实例(用于截取字符串)
2014/10/16 Javascript
JS实现表格数据各种搜索功能的方法
2015/03/03 Javascript
jQuery插件实现多级联动菜单效果
2015/12/01 Javascript
浅谈Angular路由守卫
2017/08/26 Javascript
在vue中使用Autoprefixed的方法
2018/07/27 Javascript
JsonProperty 的使用方法详解
2019/10/11 Javascript
ES6函数和数组用法实例分析
2020/05/23 Javascript
从零学python系列之数据处理编程实例(二)
2014/05/22 Python
Python实现比较两个列表(list)范围
2015/06/12 Python
python实现读取excel写入mysql的小工具详解
2017/11/20 Python
用python 实现在不确定行数情况下多行输入方法
2019/01/28 Python
基于python进行抽样分布描述及实践详解
2019/09/02 Python
python Django框架实现web端分页呈现数据
2019/10/31 Python
python中pandas库中DataFrame对行和列的操作使用方法示例
2020/06/14 Python
使用TensorBoard进行超参数优化的实现
2020/07/06 Python
flask开启多线程的具体方法
2020/08/02 Python
python中的插入排序的简单用法
2021/01/19 Python
阿里旅行:飞猪
2017/01/05 全球购物
Farfetch中文官网:奢侈品牌时尚购物平台
2020/03/15 全球购物
前台文员的岗位职责
2013/11/14 职场文书
临床医学专业学生的自我评价分享
2013/11/21 职场文书
入党自我评价范文
2014/02/02 职场文书
党建工作整改措施
2014/10/28 职场文书
教师师德承诺书2016
2016/03/25 职场文书
2016年社区国庆节活动总结
2016/04/01 职场文书
python 实现图与图之间的间距调整subplots_adjust
2021/05/21 Python