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入门:这篇文章带你直接学会python
Sep 14 Python
解读python如何实现决策树算法
Oct 11 Python
python 快速把超大txt文件转存为csv的实例
Oct 26 Python
python 实现将多条曲线画在一幅图上的方法
Jul 07 Python
python mysql断开重连的实现方法
Jul 26 Python
python实现的自动发送消息功能详解
Aug 15 Python
Python计算不规则图形面积算法实现解析
Nov 22 Python
python 实现提取log文件中的关键句子,并进行统计分析
Dec 24 Python
浅析Python 抽象工厂模式的优缺点
Jul 13 Python
cookies应对python反爬虫知识点详解
Nov 25 Python
Python从MySQL数据库中面抽取试题,生成试卷
Jan 14 Python
Python使用MapReduce进行简单的销售统计
Apr 22 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
桌面中心(三)修改数据库
2006/10/09 PHP
zf框架的校验器使用使用示例(自定义校验器和校验器链)
2014/03/13 PHP
destoon后台网站设置变成空白的解决方法
2014/06/21 PHP
Joomla简单判断用户是否登录的方法
2016/05/04 PHP
PHP上传文件及图片到七牛的方法
2018/07/25 PHP
浅谈PHP array_search 和 in_array 函数效率问题
2019/10/15 PHP
刷新时清空文本框内容的js代码
2007/04/23 Javascript
解析JavaScript中的标签语句
2013/06/19 Javascript
js charAt的使用示例
2014/02/18 Javascript
实用框架(iframe)操作代码
2014/10/23 Javascript
ztree获取选中节点时不能进入可视区域出现BUG如何解决
2015/12/03 Javascript
Bootstrap实现默认导航栏效果
2020/09/21 Javascript
jQuery实现的点赞随机数字显示动画效果(附在线演示与demo源码下载)
2015/12/31 Javascript
JS 事件绑定、事件监听、事件委托详细介绍
2016/09/28 Javascript
微信小程序开发经验总结(推荐)
2017/01/11 Javascript
jQuery实现百度图片移入移出内容提示框上下左右移动的效果
2018/06/05 jQuery
Node.js命令行/批处理中如何更改Linux用户密码浅析
2018/07/22 Javascript
详解为生产环境编译Angular2应用的方法
2018/12/10 Javascript
浅析JS中NEW的实现原理及重写
2020/02/20 Javascript
一个基于flask的web应用诞生 用户注册功能开发(5)
2017/04/11 Python
基于python select.select模块通信的实例讲解
2017/09/21 Python
Python 3.x基于Xml数据的Http请求方法
2018/12/28 Python
python实现控制台打印的方法
2019/01/12 Python
Python 微信之获取好友昵称并制作wordcloud的实例
2019/02/21 Python
python实现各种插值法(数值分析)
2019/07/30 Python
Python Gluon参数和模块命名操作教程
2019/12/18 Python
python实现opencv+scoket网络实时图传
2020/03/20 Python
解决pymysql cursor.fetchall() 获取不到数据的问题
2020/05/15 Python
pycharm实现print输出保存到txt文件
2020/06/01 Python
python 窃取摄像头照片的实现示例
2021/01/08 Python
BONIA波尼亚新加坡官网:皮革手袋,鞋类和配件
2016/08/25 全球购物
澳大利亚旅游网站:Lastminute
2017/08/07 全球购物
数组越界问题
2015/10/21 面试题
this关键字的含义
2015/04/08 面试题
社区创先争优承诺书
2014/08/30 职场文书
学校领导班子群众路线整改措施
2014/09/16 职场文书