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实现调用其他python脚本的方法
Oct 05 Python
对python中的logger模块全面讲解
Apr 28 Python
Python3用tkinter和PIL实现看图工具
Jun 21 Python
Python 3 实现定义跨模块的全局变量和使用教程
Jul 07 Python
python点击鼠标获取坐标(Graphics)
Aug 10 Python
tensorflow:指定gpu 限制使用量百分比,设置最小使用量的实现
Feb 06 Python
python导入库的具体方法
Jun 18 Python
Python实现GIF图倒放
Jul 16 Python
解决import tensorflow导致jupyter内核死亡的问题
Feb 06 Python
Python文件的操作示例的详细讲解
Apr 08 Python
详解python中[-1]、[:-1]、[::-1]、[n::-1]使用方法
Apr 25 Python
Python实现随机生成迷宫并自动寻路
Jun 13 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常用特殊运算符号和函数总结(php新手入门必看)
2013/02/02 PHP
thinkphp连贯操作实例分析
2014/11/22 PHP
php自定文件保存session的方法
2014/12/10 PHP
Web程序工作原理详解
2014/12/25 PHP
在Mac OS上编译安装Nginx+PHP+MariaDB开发环境的教程
2016/02/23 PHP
yii2带搜索功能的下拉框实例详解
2016/05/12 PHP
PHP空值检测函数与方法汇总
2017/11/19 PHP
php中错误处理操作实例分析
2019/08/23 PHP
JavaScript使用HTML5的window.postMessage实现跨域通信例子
2014/04/11 Javascript
js跨域问题浅析及解决方法优缺点对比
2014/11/08 Javascript
JavaScript中的object转换函数toString()与valueOf()介绍
2014/12/31 Javascript
JavaScript事件类型中焦点、鼠标和滚轮事件详解
2016/01/25 Javascript
javascript事件冒泡简单示例
2016/06/20 Javascript
jQuery如何获取动态添加的元素
2016/06/24 Javascript
轻松实现js弹框显示选项
2016/09/13 Javascript
Vue.JS入门教程之列表渲染
2016/12/01 Javascript
JS实现动态给标签控件添加事件的方法示例
2017/05/13 Javascript
JS判断非空至少输入两个字符的简单实现方法
2017/06/23 Javascript
深入浅析Node.js单线程模型
2017/07/10 Javascript
分析JS中this引发的bug
2017/12/12 Javascript
微信小程序实现图片选择并预览功能
2019/07/25 Javascript
详解如何在Vue项目中发送jsonp请求
2019/10/25 Javascript
vue实践---根据不同环境,自动转换请求的url地址操作
2020/09/21 Javascript
[00:12]DAC SOLO赛卫冕冠军 VG.Paparazi灬展现SOLO技巧
2018/04/06 DOTA
python结合shell查询google关键词排名的实现代码
2016/02/27 Python
Python程序退出方式小结
2017/12/09 Python
使用jupyter notebook直接打开.md格式的文件
2020/04/10 Python
使用Python中tkinter库简单gui界面制作及打包成exe的操作方法(二)
2020/10/12 Python
详解Html5原生拖拽操作
2018/01/12 HTML / CSS
英国家具、照明、家居用品网上商店:Wayfair.co.uk
2020/02/13 全球购物
优秀员工自荐书
2013/12/19 职场文书
工作疏忽检讨书
2014/01/25 职场文书
大学生安全责任书
2014/07/25 职场文书
订货会主持词
2015/07/01 职场文书
JS Object构造函数之Object.freeze
2021/04/28 Javascript
Java实现简单小画板
2022/06/10 Java/Android