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中的序列化存储的方法
Apr 28 Python
python简单的函数定义和用法实例
May 07 Python
python实现下载指定网址所有图片的方法
Aug 08 Python
python自动12306抢票软件实现代码
Feb 24 Python
在python中pandas读文件,有中文字符的方法
Dec 12 Python
对Python3使运行暂停的方法详解
Feb 18 Python
python 使用while写猜年龄小游戏过程解析
Oct 07 Python
Python猴子补丁知识点总结
Jan 05 Python
Pytorch 实现计算分类器准确率(总分类及子分类)
Jan 18 Python
python中doctest库实例用法
Dec 31 Python
Matlab使用Plot函数实现数据动态显示方法总结
Feb 25 Python
从np.random.normal()到正态分布的拟合操作
Jun 02 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
smarty静态实验表明,网络上是错的~呵呵
2006/11/25 PHP
PHP读取ACCESS数据到MYSQL的代码
2011/05/11 PHP
php求一个网段开始与结束IP地址的方法
2015/07/09 PHP
PHP获取文件扩展名的4种方法
2015/11/24 PHP
PHP实现批量上传单个文件
2015/12/29 PHP
详解WordPress中分类函数wp_list_categories的使用
2016/01/04 PHP
PHP检查端口是否可以被绑定的方法示例
2018/08/09 PHP
比较详细的javascript对象的property和prototype是什么一种关系
2007/08/06 Javascript
开发跨浏览器javascript常见注意事项
2009/01/01 Javascript
JQuery slideshow的一个小问题(如何发现及解决过程)
2013/02/06 Javascript
jQuery的缓存机制浅析
2014/06/07 Javascript
使用jQuery实现验证上传图片的格式与大小
2014/12/03 Javascript
jQuery获取checkbox选中的值
2016/01/28 Javascript
JS封装的选项卡TAB切换效果示例
2016/09/20 Javascript
原生js实现中奖信息无间隙滚动效果
2017/01/18 Javascript
JavaScript实现获取远程的html到当前页面中
2017/03/26 Javascript
在vue中添加Echarts图表的基本使用教程
2017/11/22 Javascript
微信小程序分享功能之按钮button 边框隐藏和点击隐藏
2018/06/14 Javascript
详解redux异步操作实践
2018/08/15 Javascript
9102年webpack4搭建vue项目的方法步骤
2019/02/20 Javascript
JS正则表达式验证端口范围(0-65535)
2020/01/06 Javascript
ant-design-vue 快速避坑指南(推荐)
2020/01/21 Javascript
[01:05:56]Liquid vs VP Supermajor决赛 BO 第二场 6.10
2018/07/04 DOTA
python3利用Dlib19.7实现人脸68个特征点标定
2018/02/26 Python
Python实现将HTML转成PDF的方法分析
2019/05/04 Python
python实现图片素描效果
2020/09/26 Python
HTML5 常见面试题之PC端和移动端区别介绍
2018/01/22 HTML / CSS
Raffaello Network德国:意大利拉斐尔时尚购物网
2019/05/01 全球购物
护士毕业生自我鉴定
2014/02/08 职场文书
运动会通讯稿200字
2014/02/16 职场文书
岗位标兵事迹材料
2014/05/17 职场文书
新闻编辑求职信
2014/07/13 职场文书
2014年祖国生日寄语
2014/09/19 职场文书
2015年出纳工作总结与计划
2015/05/18 职场文书
背起爸爸上学观后感
2015/06/08 职场文书
Python卷积神经网络图片分类框架详解分析
2021/11/07 Python