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 相关文章推荐
自动化Nginx服务器的反向代理的配置方法
Jun 28 Python
Django objects.all()、objects.get()与objects.filter()之间的区别介绍
Jun 12 Python
python通过opencv实现批量剪切图片
Nov 13 Python
用matplotlib画等高线图详解
Dec 14 Python
matplotlib savefig 保存图片大小的实例
May 24 Python
详解Python3中setuptools、Pip安装教程
Jun 18 Python
PyTorch学习:动态图和静态图的例子
Jan 06 Python
Python OpenCV读取显示视频的方法示例
Feb 20 Python
python使用pymongo与MongoDB基本交互操作示例
Apr 09 Python
django正续或者倒序查库实例
May 19 Python
Python用K-means聚类算法进行客户分群的实现
Aug 23 Python
浅谈Python3中datetime不同时区转换介绍与踩坑
Aug 02 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
php递归列出所有文件和目录的代码
2008/09/10 PHP
PHP 身份验证方面的函数
2009/10/11 PHP
php安装swoole扩展的方法
2015/03/19 PHP
PHP面向对象程序设计之命名空间与自动加载类详解
2016/12/02 PHP
PHP+MySQL高并发加锁事务处理问题解决方法
2018/04/30 PHP
20行代码实现的一个CSS覆盖率测试脚本
2013/07/07 Javascript
JavaScript基础知识学习笔记
2014/12/02 Javascript
js实现类似新浪微博首页内容渐显效果的方法
2015/04/10 Javascript
jQuery实现的简单折叠菜单(折叠面板)效果代码
2015/09/16 Javascript
轻松学习Javascript闭包函数
2015/12/15 Javascript
JS弹出新窗口被拦截的解决方法
2016/08/09 Javascript
Angularjs使用ng-repeat中$even和$odd属性的注意事项
2016/12/31 Javascript
浅析JavaScript中var that=this
2017/02/17 Javascript
基于原生js运动方式关键点的总结(推荐)
2017/10/01 Javascript
一次记住JavaScript的6个正则表达式方法
2018/02/22 Javascript
vue组件文档(.md)中如何自动导入示例(.vue)详解
2019/01/25 Javascript
JS实现的字符串数组去重功能小结
2019/06/17 Javascript
Mac OS X10.9安装的Python2.7升级Python3.3步骤详解
2013/12/04 Python
python字典基本操作实例分析
2015/07/11 Python
十条建议帮你提高Python编程效率
2016/02/16 Python
python编写俄罗斯方块
2020/03/13 Python
Python爬虫实现百度翻译功能过程详解
2020/05/29 Python
Python 使用office365邮箱的示例
2020/10/29 Python
基于Django集成CAS实现流程详解
2020/11/28 Python
DBA数据库管理员JAVA程序员架构师必看
2016/02/07 面试题
竞选学习委员演讲稿
2014/04/28 职场文书
寻找最美家庭活动方案
2014/08/20 职场文书
公安民警正风肃纪剖析材料
2014/10/10 职场文书
单位婚育证明范本
2014/11/21 职场文书
公证处委托书
2015/01/28 职场文书
2015年护士医德医风自我评价
2015/03/03 职场文书
台风停课通知
2015/04/24 职场文书
2015年销售内勤工作总结
2015/04/27 职场文书
毕业设计工作总结
2015/08/14 职场文书
MySQL中VARCHAR与CHAR格式数据的区别
2021/05/26 MySQL
PHP 时间处理类Carbon
2022/05/20 PHP