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黑魔法@property装饰器的使用技巧解析
Jun 16 Python
Python的Django框架中forms表单类的使用方法详解
Jun 21 Python
python线程、进程和协程详解
Jul 19 Python
详解python中xlrd包的安装与处理Excel表格
Dec 16 Python
Django中数据库的数据关系:一对一,一对多,多对多
Oct 21 Python
几个适合python初学者的简单小程序,看完受益匪浅!(推荐)
Apr 16 Python
Windows 安装 Anaconda3+PyCharm的方法步骤
Jun 13 Python
详解Python图像处理库Pillow常用使用方法
Sep 02 Python
详解python中各种文件打开模式
Jan 19 Python
使用SimpleITK读取和保存NIfTI/DICOM文件实例
Jul 01 Python
Python 数据的累加与统计的示例代码
Aug 03 Python
Python中使用Opencv开发停车位计数器功能
Apr 04 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 常用类整理
2009/12/23 PHP
php处理文件的小例子(解压缩,删除目录)
2013/02/03 PHP
支持png透明图片的php生成缩略图类分享
2015/02/08 PHP
php中使用key,value,current,next和prev函数遍历数组的方法
2015/03/17 PHP
laravel5使用freetds连接sql server的方法
2018/12/07 PHP
Extjs列表详细信息窗口新建后自动加载解决方法
2010/04/02 Javascript
node.js中的querystring.parse方法使用说明
2014/12/10 Javascript
jQuery源码解读之removeAttr()方法分析
2015/02/20 Javascript
浅析javascript中的DOM
2015/03/01 Javascript
浅谈javascript获取元素transform参数
2015/07/24 Javascript
JQuery datepicker 用法详解
2015/12/25 Javascript
jQuery实现订单提交页发送短信功能前端处理方法
2016/07/04 Javascript
基于jQuery.validate及Bootstrap的tooltip开发气泡样式的表单校验组件思路详解
2016/07/18 Javascript
vue 页面加载进度条组件实例
2018/02/05 Javascript
微信小程序BindTap快速连续点击目标页面跳转多次问题处理
2019/04/08 Javascript
vue 获取视频时长的实例代码
2019/08/20 Javascript
详解elementUI中input框无法输入的问题
2020/04/27 Javascript
在Vue中使用Select选择器拼接label的操作
2020/10/22 Javascript
js实现弹幕墙效果
2020/12/10 Javascript
[40:29]2018DOTA2亚洲邀请赛 4.7总决赛 LGD vs Mineski 第一场
2018/04/10 DOTA
python实现的登陆Discuz!论坛通用代码分享
2014/07/11 Python
Python下singleton模式的实现方法
2014/07/16 Python
星球大战与Python之间的那些事
2016/01/07 Python
python实现简单购物商城
2016/05/21 Python
python一键升级所有pip package的方法
2017/01/16 Python
网站渗透常用Python小脚本查询同ip网站
2017/05/08 Python
关于Django外键赋值问题详解
2017/08/13 Python
Python基于辗转相除法求解最大公约数的方法示例
2018/04/04 Python
Python3 itchat实现微信定时发送群消息的实例代码
2019/07/12 Python
python输出数组中指定元素的所有索引示例
2019/12/06 Python
python Matplotlib数据可视化(1):简单入门
2020/09/30 Python
Python爬虫之Selenium鼠标事件的实现
2020/12/04 Python
加拿大国民体育购物网站:National Sports
2018/11/04 全球购物
2014三八妇女节活动总结
2014/03/01 职场文书
2016年推广普通话宣传周活动总结
2016/04/06 职场文书
2019公司借款合同范本2篇!
2019/07/24 职场文书