python计数排序和基数排序算法实例


Posted in Python onApril 25, 2014

一、计数排序

计数排序(Counting sort)是一种稳定的排序算法

算法的步骤如下:
找出待排序的数组中最大和最小的元素
统计数组中每个值为i的元素出现的次数,存入数组C的第i项
对所有的计数累加(从C中的第一个元素开始,每一项和前一项相加)
反向填充目标数组:将每个元素i放在新数组的第C(i)项,每放一个元素就将C(i)减去1
当输入的元素是 n 个 0 到 k 之间的整数时,计数排序的时间复杂度为O(N+K),空间复杂度为O(N+K)。当K不是很大时,这是一个很有效的线性排序算法。

以下是测试代码:

#-*- coding:utf8 -*-
import randomdef jishu(data, max):
    """
    基数排序:当输入的元素是 n 个 0 到 k 之间的整数时(k不能太大,即max不能太大)
    @param data: 需要排序的数组
    @param max: 最大的数
    """
    result = [None for i in xrange(len(data))]  # 最后的结果
    c = [0 for i in range(max+1)]
    # 用数组c统计每个值=d的元素个数
    for d in data:
        c[d] = c[d] + 1

    # c[i]表示data中值<=i 的元素个数
    for i in range(1, max+1):
        c[i] = c[i] + c[i-1]
    # 在将C中的元素倒着打印出来就是排序好的
    for j in xrange(len(data)-1, -1, -1):
        result[c[data[j]]-1] = data[j]
        c[data[j]] = c[data[j]] ? 1
    return result
 
if __name__ == '__main__':
    #制造1000个0到100的数字
    print jishu([random.randint(0, 100) for i in range(1000)], 100)

二、基数排序

基数排序排序(英语:Radix sort)是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。

它是这样实现的:将所有待比较数值(正整数)统一为同样的数位长度,数位较短的数前面补零。然后,从最低位开始,依次进行一次排序。这样从最低位排序一直到最高位排序完成以后, 数列就变成一个有序序列。
基数排序的方式可以采用LSD(Least significant digital)或MSD(Most significant digital),LSD的排序方式由键值的最右边开始,而MSD则相反,由键值的最左边开始。

以下是一个测试用例:

#-*- coding:utf8 -*-
import random
def jichu(data, length):
    """
    基数排 lsd 
    @param data: 需要排列的组合
    @param length: 最大的数据是几位
    """
    for l in xrange(length):
        s = [[] for i in xrange(10)]  
        for d in data:
            s[d/(10**l) % 10].append(d)
        data = [d for s_list in s for d in s_list]
    return data
 
if __name__ == '__main__':
    list = [random.randint(1, 99999999) for i in xrange(99)]  # 制造99个数据
    print jichu(list, 8)

Python 相关文章推荐
python元组操作实例解析
Sep 23 Python
Python实现简单状态框架的方法
Mar 19 Python
简单介绍Ruby中的CGI编程
Apr 10 Python
浅析使用Python操作文件
Jul 31 Python
matplotlib在python上绘制3D散点图实例详解
Dec 09 Python
python中aioysql(异步操作MySQL)的方法
Apr 11 Python
Python3 requests文件下载 期间显示文件信息和下载进度代码实例
Aug 16 Python
调试Django时打印SQL语句的日志代码实例
Sep 12 Python
使用python实现多维数据降维操作
Feb 24 Python
Django框架获取form表单数据方式总结
Apr 22 Python
Django ORM 查询表中某列字段值的方法
Apr 30 Python
Python压缩模块zipfile实现原理及用法解析
Aug 14 Python
python处理圆角图片、圆形图片的例子
Apr 25 #Python
python实现的阳历转阴历(农历)算法
Apr 25 #Python
Python实现的简单万年历例子分享
Apr 25 #Python
python实现simhash算法实例
Apr 25 #Python
python实现DNS正向查询、反向查询的例子
Apr 25 #Python
python网络编程之TCP通信实例和socketserver框架使用例子
Apr 25 #Python
python网络编程之UDP通信实例(含服务器端、客户端、UDP广播例子)
Apr 25 #Python
You might like
关于Intype一些小问题的解决办法
2008/03/28 PHP
php关于array_multisort多维数组排序的使用说明
2011/01/04 PHP
php实现简单洗牌算法
2013/06/18 PHP
zend optimizer在wamp的基础上安装图文教程
2013/10/26 PHP
学习php开源项目的源码指南
2014/12/21 PHP
PHP中把对象数组转换成普通数组的方法
2015/07/10 PHP
JavaScript 继承使用分析
2011/05/12 Javascript
javascript事件冒泡详解和捕获、阻止方法
2014/04/12 Javascript
单元选择合并变色示例代码
2014/05/26 Javascript
js实现滑动触屏事件监听的方法
2015/05/05 Javascript
js给selected添加options的方法
2015/05/06 Javascript
jquery实现自定义图片裁剪功能【推荐】
2017/03/08 Javascript
AngularJS 表单验证手机号的实例(非必填)
2017/11/12 Javascript
bootstrap响应式工具使用详解
2017/11/29 Javascript
nodejs结合socket.io实现websocket通信功能的方法
2018/01/12 NodeJs
详解vue-router数据加载与缓存使用总结
2018/10/29 Javascript
解决vue项目,npm run build后,报路径错的问题
2020/08/13 Javascript
Python 读写文件和file对象的方法(推荐)
2016/09/12 Python
Python矩阵常见运算操作实例总结
2017/09/29 Python
python实现快速排序的示例(二分法思想)
2018/03/12 Python
对Python中一维向量和一维向量转置相乘的方法详解
2019/08/26 Python
python保留小数位的三种实现方法
2020/01/07 Python
Python3.6 + TensorFlow 安装配置图文教程(Windows 64 bit)
2020/02/24 Python
CSS3实例分享--超炫checkbox复选框和radio单选框
2014/09/01 HTML / CSS
Canvas系列之滤镜效果
2019/02/12 HTML / CSS
韩国最大的购物网站:Gmarket
2019/06/20 全球购物
以实惠的价格轻松租车,免费取消:Easyrentcars
2019/07/16 全球购物
澳洲本土太阳镜品牌:Quay Australia
2019/07/29 全球购物
什么是规则表达式
2012/05/03 面试题
UNIX文件名称有什么规定
2013/03/25 面试题
毕业生文员求职信
2013/11/03 职场文书
班子四风对照检查材料
2014/08/21 职场文书
微观世界观后感
2015/06/10 职场文书
小学生大队委竞选稿
2015/11/20 职场文书
游戏开发中如何使用CocosCreator进行音效处理
2021/04/14 Javascript
Python 数据可视化之Seaborn详解
2021/11/02 Python