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和Ruby中each循环引用变量问题(一个隐秘BUG?)
Jun 04 Python
Python open()文件处理使用介绍
Nov 30 Python
Python中subprocess的简单使用示例
Jul 28 Python
基于Python如何使用AIML搭建聊天机器人
Jan 27 Python
《Python学习手册》学习总结
Jan 17 Python
python url 参数修改方法
Dec 26 Python
如何用Python破解wifi密码过程详解
Jul 12 Python
python+mysql实现个人论文管理系统
Oct 25 Python
Python实现随机取一个矩阵数组的某几行
Nov 26 Python
在Python中实现函数重载的示例代码
Dec 12 Python
利用Python+OpenCV三步去除水印
May 28 Python
浅谈python中的多态
Jun 15 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加密解密的代码
2007/07/16 PHP
php中获取远程客户端的真实ip地址的方法
2011/08/03 PHP
TP5框架实现一次选择多张图片并预览的方法示例
2020/04/04 PHP
如何在PHP环境中使用ProtoBuf数据格式
2020/06/19 PHP
可实现多表单提交的javascript函数
2007/08/01 Javascript
使用Post提交时须将空格转换成加号的解释
2013/01/14 Javascript
表格奇偶行设置不同颜色的核心JS代码
2013/12/24 Javascript
jQuery中first()方法用法实例
2015/01/06 Javascript
利用Angularjs实现幻灯片效果
2016/09/07 Javascript
js转换对象为xml
2017/02/17 Javascript
js获取浏览器地址(获取第1个斜杠后的内容)
2019/09/03 Javascript
vue轮播组件实现$children和$parent 附带好用的gif录制工具
2019/09/26 Javascript
JS前端模块化原理与实现方法详解
2020/03/17 Javascript
如何实现vue的tree组件
2020/12/03 Vue.js
[11:42]2018DOTA2国际邀请赛寻真——OG卷土重来
2018/08/17 DOTA
Python分治法定义与应用实例详解
2017/07/28 Python
python Flask实现restful api service
2017/12/04 Python
Python之循环结构
2019/01/15 Python
用Python+OpenCV对比图像质量的几种方法
2019/07/15 Python
python使用writerows写csv文件产生多余空行的处理方法
2019/08/01 Python
python 画3维轨迹图并进行比较的实例
2019/12/06 Python
Python3自定义http/https请求拦截mitmproxy脚本实例
2020/05/11 Python
PIL.Image.open和cv2.imread的比较与相互转换的方法
2020/06/03 Python
全面总结使用CSS实现水平垂直居中效果的方法
2016/03/10 HTML / CSS
HTML5画渐变背景图片并自动下载实现步骤
2013/11/18 HTML / CSS
维氏瑞士军刀英国网站:Victorinox英国
2019/07/04 全球购物
.NET笔试题(20个问题)
2016/02/02 面试题
医学护理系毕业生求职信
2013/10/01 职场文书
班主任工作经验交流材料
2014/05/13 职场文书
战友聚会策划方案
2014/06/13 职场文书
节约用电标语
2014/06/17 职场文书
项目申报专员岗位职责
2014/07/09 职场文书
干部作风建设心得体会
2014/10/22 职场文书
商铺租房协议书范本
2014/12/04 职场文书
三孔导游词
2015/02/05 职场文书
图文详解Nginx版本平滑升级方案
2021/09/15 Servers