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实现得到一个给定类的虚函数
Sep 28 Python
python 转换 Javascript %u 字符串为python unicode的代码
Sep 06 Python
python中返回矩阵的行列方法
Apr 04 Python
Python实现读写INI配置文件的方法示例
Jun 09 Python
python安装numpy和pandas的方法步骤
May 27 Python
Django框架之登录后自定义跳转页面的实现方法
Jul 18 Python
python写入数据到csv或xlsx文件的3种方法
Aug 23 Python
python+opencv边缘提取与各函数参数解析
Mar 09 Python
解决keras backend 越跑越慢问题
Jun 18 Python
Python filter()及reduce()函数使用方法解析
Sep 05 Python
python自动化测试三部曲之unittest框架的实现
Oct 07 Python
Python基于staticmethod装饰器标示静态方法
Oct 17 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 Smarty date_format [格式化时间日期]
2010/03/15 PHP
php数据类型判断函数有哪些
2013/09/23 PHP
理解PHP中的stdClass类
2014/04/18 PHP
PHP实现的数据对象映射模式详解
2019/03/20 PHP
Jquery 学习笔记(一)
2009/10/13 Javascript
Jquery cookie操作代码
2010/03/14 Javascript
js输入框邮箱自动提示功能代码实现
2013/12/10 Javascript
js图片自动轮播代码分享(js图片轮播)
2014/05/06 Javascript
jquery动态加载js/css文件方法(自写小函数)
2014/10/11 Javascript
使用javascript获取页面名称
2014/12/23 Javascript
javascript实现起伏的水波背景效果
2016/05/16 Javascript
JS动态计算移动端rem的解决方案
2016/10/14 Javascript
微信小程序开发教程-手势解锁实例
2017/01/06 Javascript
vue+springboot前后端分离实现单点登录跨域问题解决方法
2018/01/30 Javascript
详解vue如何使用rules对表单字段进行校验
2018/10/17 Javascript
JavaScript 处理树数据结构的方法示例
2019/06/16 Javascript
python将人民币转换大写的脚本代码
2013/02/10 Python
python使用PyGame模块播放声音的方法
2015/05/20 Python
Python Socket使用实例
2017/12/18 Python
解决python3 网络请求路径包含中文的问题
2018/05/10 Python
解决PyCharm import torch包失败的问题
2018/10/13 Python
Python分布式进程中你会遇到的问题解析
2019/05/28 Python
Python爬虫程序架构和运行流程原理解析
2020/03/09 Python
python读取配置文件方式(ini、yaml、xml)
2020/04/09 Python
Mytheresa中国官网:德国时尚奢侈品商城
2017/08/04 全球购物
广州喜创信息技术有限公司JAVA软件工程师笔试题
2012/10/17 面试题
自荐信封面
2013/12/04 职场文书
应届毕业生个人求职信范文
2014/01/29 职场文书
旅游文化节策划方案
2014/06/06 职场文书
常务副县长“四风”个人对照检查材料思想汇报
2014/10/02 职场文书
污水处理保证书
2015/05/09 职场文书
2019通用版劳动合同范本!
2019/07/11 职场文书
深度学习tensorflow基础mnist
2021/04/14 Python
解读Vue组件注册方式
2021/05/15 Vue.js
opencv 分类白天与夜景视频的方法
2021/06/05 Python
mysql的数据压缩性能对比详情
2021/11/07 MySQL