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 22 Python
跟老齐学Python之玩转字符串(1)
Sep 14 Python
Python3实现将文件树中所有文件和子目录归档到tar压缩文件的方法
May 22 Python
详解JavaScript编程中的window与window.screen对象
Oct 26 Python
Python二叉搜索树与双向链表转换实现方法
Apr 29 Python
python reduce 函数使用详解
Dec 05 Python
Python3.5基础之变量、数据结构、条件和循环语句、break与continue语句实例详解
Apr 26 Python
pip安装python库的方法总结
Aug 02 Python
django写用户登录判定并跳转制定页面的实例
Aug 21 Python
Python各种扩展名区别点整理
Feb 27 Python
Python日志处理模块logging用法解析
May 19 Python
keras中模型训练class_weight,sample_weight区别说明
May 23 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
利用浏览器的Javascript控制台调试PHP程序
2014/01/08 PHP
js中查找最近的共有祖先元素的实现代码
2010/12/30 Javascript
用原生JavaScript实现jQuery的$.getJSON的解决方法
2013/05/03 Javascript
JS小游戏之极速快跑源码详解
2014/09/25 Javascript
JQuery判断radio是否选中并获取选中值的示例代码
2014/10/17 Javascript
通过伪协议解决父页面与iframe页面通信的问题
2015/04/05 Javascript
微信小程序使用第三方库Underscore.js步骤详解
2016/09/27 Javascript
AngularJS+Bootstrap实现多文件上传与管理
2016/11/08 Javascript
概述jQuery的元素筛选
2016/11/23 Javascript
bootstrap table 表格中增加下拉菜单末行出现滚动条的快速解决方法
2017/01/05 Javascript
Node.js中流(stream)的使用方法示例
2017/07/16 Javascript
VUE实现一个分页组件的示例
2017/09/13 Javascript
微信小程序实现图片上传功能实例(前端+PHP后端)
2018/01/10 Javascript
使用Vue自定义指令实现Select组件
2018/05/24 Javascript
在vue项目中引入highcharts图表的方法
2019/01/21 Javascript
layui checkbox默认选中,获取选中值,清空所有选中项的例子
2019/09/02 Javascript
VUE中V-IF条件判断改变元素的样式操作
2020/08/09 Javascript
Vue中引入svg图标的两种方式
2021/01/14 Vue.js
[52:08]DOTA2上海特级锦标赛主赛事日 - 3 败者组第三轮#2Fnatic VS OG第一局
2016/03/05 DOTA
[43:36]Liquid vs Mineski 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
跟老齐学Python之编写类之二方法
2014/10/11 Python
Python中使用scapy模拟数据包实现arp攻击、dns放大攻击例子
2014/10/23 Python
Python基于pygame模块播放MP3的方法示例
2017/09/30 Python
使用numba对Python运算加速的方法
2018/10/15 Python
python 多线程对post请求服务器测试并发的方法
2019/06/13 Python
Python3开发环境搭建详细教程
2020/06/18 Python
django form和field具体方法和属性说明
2020/07/09 Python
html5 CSS过度-webkit-transition使用介绍
2013/07/02 HTML / CSS
html5小技巧之通过document.head获取head元素
2014/06/04 HTML / CSS
Zavvi美国:英国娱乐之家
2017/03/19 全球购物
阿联酋航空官方网站:Emirates
2017/10/17 全球购物
TUMI新加坡官网:国际领先的商旅箱包品牌
2019/01/12 全球购物
如何现实servlet的单线程模式
2014/08/05 面试题
机电专业毕业生推荐信
2013/11/10 职场文书
纪律教育月活动总结
2014/08/26 职场文书
Redis Cluster集群动态扩容的实现
2021/07/15 Redis