python计数排序和基数排序算法实例
发布时间:2023-11-01 01:23:26
一、计数排序
计数排序(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 random
def 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)是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。
它是这样实现的:将所有待比较数值(正整数)统一为同样的数位长度,数位较短的数前面补零。然后,从最低位开始,依次进行一次排序。这样从最低位排序一直到最高位排序完成以后, 数列就变成一个有序序列。
基数排序的方式可以采用 * (Least significant digital)或MSD(Most significant digital), * 的排序方式由键值的最右边开始,而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)


猜你喜欢
- 最近在一个项目中遇到一个查询页面,其中一个查询条件是根据选择的年份、月以及周数显示选择的该周从几号到几号,这样一个需求。在网上搜
- (一)索引的作用索引通俗来讲就相当于书的目录,当我们根据条件查询的时候,没有索引,便需要全表扫描,数据量少还可以,一旦数据量超过百万甚至千万
- 有时候使用到获取本机IP,就采用以下方式进行。#!/usr/bin/python import socketimport stru
- 执行效果如下:from tkinter import *import urllib.requestimport gzipimport jso
- 本篇文章面向的读者: 已经基本掌握Go中的 协程(goroutine),通道(channel),互斥锁(sync.Mutex),读
- 一、正则表达式的特殊字符介绍正则表达式^ 匹配行首 &nb
- isU是大小写分的意思,这里s还有则不包括换行符而U是反转了匹配数量的值使其不是默认的重复,大概就是这样了个体我们看文章。正则后面的/(.*
- 如下所示:from bs4 import BeautifulSouppath = './web/new_index.html'
- 何为聚类分析聚类分析或聚类是对一组对象进行分组的任务,使得同一组(称为聚类)中的对象(在某种意义上)与其他组(聚类)中的对象更相似(在某种意
- 前言这段时间刚刚学习了一段时间的Python,加上自己是做iOS开发的,就想着用Python来做一个自动化打包,可以自动完成打包,上传到蒲公
- wed的打印方法具我自己懂得知道的有: 1、JQuery插件Jqprint实现 2、JQery打印插件PrintArea实现网页打印 3、C
- 一文搞懂golang定时器Timer的用法和实现原理前言定时器在Go语言应用中使用非常广泛,Go语言的标准库里提供两种类型的计时器,一种是一
- 正好最近的域名备案通过了,兴起就突然想做一个网页,虽然之前去备案域名也是有这个目的。问过几个人,说用linux上用PHP搭建网站很简单,就试
- numpy和matlab的几点差异Python numpy和matlab都是便捷灵活的科学计算语言,两者具有很多相似之处,但也有一些混淆的地
- 对于小数据量,xml文件在检索更新上于ACCESS有很多优势。我曾经测试过不用数据库,把网站的会员信息,商品数据信息,交易信息,网站定制信息
- 本文实例讲述了python序列化与数据持久化。分享给大家供大家参考,具体如下:数据持久化的方式有:1.普通文件无格式写入:将数据直接写入到文
- 在sql语句中,如果查找某个文本字段值为空的可以用select * from 表 where 字段=''但是如果
- 本文实例为大家分享了python opencv识别图像轮廓的具体代码,供大家参考,具体内容如下要求:用矩形或者圆形框住图片中的云朵(不要求全
- 由于后台程序会过滤掉单引号,所以有些地方如果出现莫民奇妙的空格,就表示单引号,特此说明。 /** * @author Super Sha *
- 可以使用python中的sys模块的getrefcount()方法来获取对象引用的个数。具体可以看以下的实例:import sys # 首先