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中urllib.unquote乱码的原因与解决方法
Apr 24 Python
Django中url的反向查询的方法
Mar 14 Python
python3 判断列表是一个空列表的方法
May 04 Python
Python OpenCV处理图像之滤镜和图像运算
Jul 10 Python
Python批处理更改文件名os.rename的方法
Oct 26 Python
在pycharm中使用git版本管理以及同步github的方法
Jan 16 Python
Django框架验证码用法实例分析
May 10 Python
Python错误的处理方法
Jun 23 Python
python 如何设置守护进程
Oct 29 Python
scrapy处理python爬虫调度详解
Nov 23 Python
matplotlib绘制鼠标的十字光标的实现(内置方式)
Jan 06 Python
Python+Tkinter打造签名设计工具
Apr 01 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面向对象之命令模式(必看篇)
2017/05/24 PHP
php基于数组函数实现关联表的编辑操作示例
2017/07/04 PHP
javascript 面向对象全新理练之继承与多态
2009/12/03 Javascript
JavaScript中获取元素索引的函数
2010/09/10 Javascript
js下用eval生成JSON对象
2010/09/17 Javascript
使用jQuery模板来展现json数据的代码
2010/10/22 Javascript
jQuery中:enabled选择器用法实例
2015/01/04 Javascript
Javascript基础教程之argument 详解
2015/01/18 Javascript
javascript 将共享属性迁移到原型中去的实现方法
2016/08/31 Javascript
微信小程序 网络API Websocket详解
2016/11/09 Javascript
浅谈关于axios和session的一些事
2017/07/13 Javascript
解决JQuery全选/反选第二次失效的问题
2017/10/11 jQuery
JavaScript实现的简单加密解密操作示例
2018/06/01 Javascript
WEEX环境搭建与入门详解
2019/10/16 Javascript
详解如何使用React Hooks请求数据并渲染
2020/10/18 Javascript
python 算法 排序实现快速排序
2012/06/05 Python
python创建和使用字典实例详解
2013/11/01 Python
详解JavaScript编程中的window与window.screen对象
2015/10/26 Python
python实现五子棋小游戏
2020/03/25 Python
Python实现读取txt文件中的数据并绘制出图形操作示例
2019/02/26 Python
python3利用Socket实现通信的方法示例
2019/05/06 Python
浅谈Python中的生成器和迭代器
2020/06/19 Python
容易被忽略的Python内置类型
2020/09/03 Python
Python 使用SFTP和FTP实现对服务器的文件下载功能
2020/12/17 Python
深入浅析HTML5中的SVG
2015/11/27 HTML / CSS
捷克家具销售网站:SCONTO Nábytek
2020/01/02 全球购物
让生命充满爱演讲稿
2014/05/10 职场文书
甜品店创业计划书
2014/08/14 职场文书
工作业绩不及格检讨书
2014/10/28 职场文书
护士先进个人总结
2015/02/13 职场文书
郭明义电影观后感
2015/06/08 职场文书
运动会通讯稿200字
2015/07/20 职场文书
团委副书记工作总结
2015/08/14 职场文书
2016春季校长开学典礼致辞
2015/11/26 职场文书
在Django中使用MQTT的方法
2021/05/10 Python
在Python 中将类对象序列化为JSON
2022/04/06 Python