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字典DICT类型合并详解
Aug 17 Python
Python实现字典的遍历与排序功能示例
Dec 23 Python
python list删除元素时要注意的坑点分享
Apr 18 Python
Python面向对象之静态属性、类方法与静态方法分析
Aug 24 Python
详解python做UI界面的方法
Feb 27 Python
PyCharm-错误-找不到指定文件python.exe的解决方法
Jul 01 Python
Django CBV与FBV原理及实例详解
Aug 12 Python
Python依赖包整体迁移方法详解
Aug 15 Python
Python OpenCV视频截取并保存实现代码
Nov 30 Python
python实现随机加减法生成器
Feb 24 Python
Jupyter notebook如何修改平台字体
May 13 Python
Python3爬虫mitmproxy的安装步骤
Jul 29 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 删除记录同时删除图片文件的实现代码
2010/05/12 PHP
php操作redis中的hash和zset类型数据的方法和代码例子
2014/07/05 PHP
php实现的xml操作类
2016/01/15 PHP
全面解析PHP操作Memcache基本函数
2016/07/14 PHP
thinkPHP3.2.3结合Laypage实现的分页功能示例
2018/05/28 PHP
一个javascript参数的小问题
2008/03/02 Javascript
js 验证密码强弱的小例子
2013/03/21 Javascript
一个判断抢购时间是否到达的简单的js函数
2014/06/23 Javascript
JS中字符串trim()使用示例
2015/05/26 Javascript
JavaScript中的toUTCString()方法使用详解
2015/06/12 Javascript
Jquery结合HTML5实现文件上传
2015/06/25 Javascript
jQuery平滑旋转幻灯片特效代码分享
2015/09/07 Javascript
IE9+已经不对document.createElement向下兼容的解决方法
2015/09/14 Javascript
JavaScript通过使用onerror设置默认图像显示代替alt
2016/03/01 Javascript
JavaScript编码风格指南(中文版)
2016/08/26 Javascript
JS简单实现浮动窗口效果示例
2016/09/07 Javascript
jQuery子元素过滤选择器用法示例
2016/09/09 Javascript
js学习心得_一个简单的动画库封装tween.js
2017/07/14 Javascript
nodejs使用http模块发送get与post请求的方法示例
2018/01/08 NodeJs
JavaScript中 ES6变量的结构赋值
2018/07/10 Javascript
Angular Excel 导入与导出的实现代码
2019/04/17 Javascript
Python程序设计入门(3)数组的使用
2014/06/16 Python
OpenCV 轮廓检测的实现方法
2019/07/03 Python
对python中arange()和linspace()的区别说明
2020/05/03 Python
Python并发请求下限制QPS(每秒查询率)的实现代码
2020/06/05 Python
编码转换,怎样实现将GB2312编码的字符串转换为ISO-8859-1编码的字符串
2014/01/07 面试题
网友共享的几个面试题关于Java和Unix等方面的
2016/09/08 面试题
大学自我评价
2014/02/12 职场文书
晚会主持词开场白
2014/03/17 职场文书
档案保密承诺书
2014/06/03 职场文书
我爱祖国演讲稿
2014/09/02 职场文书
2014年部门工作总结
2014/11/12 职场文书
高中生毕业评语
2014/12/30 职场文书
师德师风心得体会(2016精选篇)
2016/01/12 职场文书
《蚂蚁和蝈蝈》教学反思
2016/02/22 职场文书
不负正版帝国之名 《重返帝国》引领SLG手游制作新的标杆
2022/04/07 其他游戏