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学习笔记 下载
Feb 10 Python
python用于url解码和中文解析的小脚本(python url decoder)
Aug 11 Python
python批量生成本地ip地址的方法
Mar 23 Python
Python中的super用法详解
May 28 Python
python XlsxWriter模块创建aexcel表格的实例讲解
May 03 Python
深度辨析Python的eval()与exec()的方法
Mar 26 Python
超简单使用Python换脸实例
Mar 27 Python
Python学习笔记基本数据结构之序列类型list tuple range用法分析
Jun 08 Python
python 调用pyautogui 实时获取鼠标的位置、移动鼠标的方法
Aug 27 Python
如何在windows下安装Pycham2020软件(方法步骤详解)
May 03 Python
Python爬虫requests库多种用法实例
May 28 Python
PyTorch 中的傅里叶卷积实现示例
Dec 11 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常用正则函数实例小结
2016/12/29 PHP
PHP性能测试工具xhprof安装与使用方法详解
2018/04/29 PHP
Jquery揭秘系列:ajax原生js实现详解(推荐)
2016/06/08 Javascript
漂亮! js实现颜色渐变效果
2016/08/12 Javascript
js控制li的隐藏和显示实例代码
2016/10/15 Javascript
详解利用exif.js解决ios手机上传竖拍照片旋转90度问题
2016/11/04 Javascript
node基于async/await对mysql进行封装
2019/06/20 Javascript
在vue中使用jsx语法的使用方法
2019/09/30 Javascript
详解Vue2的diff算法
2021/01/06 Vue.js
原生js实现自定义滚动条组件
2021/01/20 Javascript
[01:25:33]完美世界DOTA2联赛PWL S3 INK ICE vs Magma 第二场 12.20
2020/12/23 DOTA
调试Python程序代码的几种方法总结
2015/04/28 Python
python引用DLL文件的方法
2015/05/11 Python
一篇文章入门Python生态系统(Python新手入门指导)
2015/12/11 Python
python协程gevent案例 爬取斗鱼图片过程解析
2019/08/27 Python
Python函数的返回值、匿名函数lambda、filter函数、map函数、reduce函数用法实例分析
2019/12/26 Python
python将图片转base64,实现前端显示
2020/01/09 Python
python实现logistic分类算法代码
2020/02/28 Python
python实现TCP文件传输
2020/03/20 Python
使用CSS3的font-face字体嵌入样式的方法讲解
2016/05/13 HTML / CSS
萨克斯第五大道精品百货店: Saks Fifth Avenue
2017/04/28 全球购物
奥地利票务门户网站:oeticket.com
2019/12/31 全球购物
保加利亚运动鞋购物网站:SneakerStudio.bg
2020/12/23 全球购物
超市后勤自我鉴定
2014/01/17 职场文书
医生进修自我鉴定
2014/01/19 职场文书
迎元旦广播稿
2014/02/22 职场文书
公司请假条格式
2014/04/11 职场文书
《去年的树》教学反思
2014/04/11 职场文书
校园广播稿精选
2014/10/01 职场文书
2014年外联部工作总结
2014/11/17 职场文书
小学教师节活动总结
2015/03/20 职场文书
前台接待员岗位职责
2015/04/15 职场文书
小学六一儿童节活动总结
2015/05/05 职场文书
2016年秋季新学期致辞
2015/07/30 职场文书
《平行四边形的面积》教学反思
2016/02/16 职场文书
原生CSS实现文字无限轮播的通用方法
2021/03/30 HTML / CSS