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脚本生成Android SALT扰码的方法
Sep 18 Python
python简单判断序列是否为空的方法
Jun 30 Python
python中list列表的高级函数
May 17 Python
python实现Zabbix-API监控
Sep 17 Python
Python高级特性切片(Slice)操作详解
Sep 27 Python
解决Python print输出不换行没空格的问题
Nov 14 Python
Python提取频域特征知识点浅析
Mar 04 Python
学Python 3的理由和必要性
Nov 19 Python
在python3中实现查找数组中最接近与某值的元素操作
Feb 29 Python
解决Django no such table: django_session的问题
Apr 07 Python
python,Java,JavaScript实现indexOf
Sep 09 Python
python图像处理 PIL Image操作实例
Apr 09 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动态编译出现Cannot find autoconf的解决方法
2014/11/05 PHP
PHP获取photoshop写入图片文字信息的方法
2015/03/31 PHP
php生成网页桌面快捷方式
2017/05/05 PHP
JS判断当前日期是否大于某个日期的实现代码
2012/09/02 Javascript
JavaScript 创建运动框架的实现代码
2013/05/08 Javascript
JavaScript 性能优化小结
2015/10/12 Javascript
功能强大的Bootstrap使用手册(一)
2016/08/02 Javascript
angular仿支付宝密码框输入效果
2017/03/25 Javascript
Angular2 父子组件数据通信实例
2017/06/22 Javascript
JavaScript正则表达式简单实用实例
2017/06/23 Javascript
基于bootstrap写的一点localStorage本地储存
2017/11/21 Javascript
vue-lazyload图片延迟加载插件的实例讲解
2018/02/09 Javascript
垃圾回收器的相关知识点总结
2018/05/13 Javascript
Python的垃圾回收机制深入分析
2014/07/16 Python
python检测某个变量是否有定义的方法
2015/05/20 Python
Python实现随机选择元素功能
2017/09/14 Python
Python cookbook(字符串与文本)在字符串的开头或结尾处进行文本匹配操作
2018/04/20 Python
Python http接口自动化测试框架实现方法示例
2018/12/06 Python
python Kmeans算法原理深入解析
2019/08/23 Python
python list多级排序知识点总结
2019/10/23 Python
Python 实现opencv所使用的图片格式与 base64 转换
2020/01/09 Python
Python新手学习raise用法
2020/06/03 Python
python 字符串的驻留机制及优缺点
2020/06/19 Python
安装pyecharts1.8.0版本后导入pyecharts模块绘图时报错: “所有图表类型将在 v1.9.0 版本开始强制使用 ChartItem 进行数据项配置 ”的解决方法
2020/08/18 Python
java字符串格式化输出实例讲解
2021/01/06 Python
Html5页面获取微信公众号的openid的方法
2020/05/12 HTML / CSS
下述程序的作用是计算机数组中的最大元素值及其下标
2012/11/26 面试题
环保宣传标语
2014/06/12 职场文书
乡镇平安建设汇报材料
2014/08/25 职场文书
局机关干部群众路线个人对照检查材料思想汇报
2014/10/05 职场文书
幼儿教师2014年度工作总结
2014/12/16 职场文书
2015年预防青少年违法犯罪工作总结
2015/05/22 职场文书
二十年同学聚会感言
2015/07/30 职场文书
创业的9条正确思考方式
2019/08/26 职场文书
python 如何在list中找Topk的数值和索引
2021/05/20 Python
css布局巧妙技巧之css三角示例的运用
2022/03/16 HTML / CSS