基于python进行桶排序与基数排序的总结


Posted in Python onMay 29, 2018

本文首先举例阐述了两种排序方法的操作步骤,然后列出了用python进行的实现过程,最后对桶式排序方法的优劣进行了简单总结。

一、桶排序:

排序一个数组[5,3,6,1,2,7,5,10]

值都在1-10之间,建立10个桶:

[0 0 0 0 0 0 0 0 0 0] 桶

[1 2 3 4 5 6 7 8 9 10] 桶代表的值

遍历数组,第一个数字5,第五个桶加1

[0 0 0 0 1 0 0 0 0 0]

第二个数字3,第三个桶加1

[0 0 1 0 1 0 0 0 0 0]

遍历后

[1 1 1 0 2 1 1 0 0 1]

输出

[1 2 3 5 5 6 7 10]

代码:

def bucket_sort(lst):
 buckets = [0] * ((max(lst) - min(lst))+1)
 for i in range(len(lst)):
  buckets[lst[i]-min(lst)] += 1
 res=[]
 for i in range(len(buckets)):
  if buckets[i] != 0:
   res += [i+min(lst)]*buckets[i]
 return res

二、基数排序:

例如,对如下数据序列进行排序。

192,221,12,23

可以观察到它的每个数据至多只有3位,因此可以将每个数据拆分成3个关键字:百位(高位)、十位、个位(低位)。如果按照习惯思维,会先比较百位,百位大的数据大,百位相同的再比较十位,十位大的数据大;最后再比较个位。基数排序方法对任一子关键字排序时必须借助于另一种排序方法,而且这种排序方法必须是稳定的。对于多关键字拆分出来的子关键字,它们一定位于0-9这个可枚举的范围内,这个范围不大,因此用桶式排序效率非常好。

代码:

from random import randint
def radix_sort(lis,d):
 for i in xrange(d):#d轮排序
  s = [[] for k in xrange(10)]#因为每一位数字都是0~9,故建立10个桶
  for j in lis:
   s[j/(10**i)%10].append(i)
  li = [a for b in s for a in b]
 return li

对数组中的元素按照从低位到高位排序,对于[192,221,12,23]第一轮按照个位数字相同的放在一组,是s[1] =[221],s[2]=[192,12],s[3]=23,第二轮按照十位数字进行排序,s[1]=[12],s[2]=[221,23],s[9]=[192],第三轮按照百位数字进行排序,s[0]=[12,23],s[1]=[192],s[2]=[221]

总结:

桶排序与基数排序常作为桶式排序出现,基数排序进行了多轮的桶排序。桶式排序不再是一种基于比较的排序方法,它是一种比较巧妙的排序方式,但这种排序方式需要待排序的序列满足以下两个特征:待排序列所有的值处于一个可枚举的范围之类;待排序列所在的这个可枚举的范围不应该太大,否则排序开销太大。可以用于学生成绩的排序,因为在若干学生中成绩的范围仅在100以内。

桶式排序的空间开销较大,它需要两个数组,第1个buckets数组用于记录“落入”各桶中元素的个数,进而保存各元素在有序序列中的位置,第2个数组用于缓存待排数据。它只能排整形数组。而且当k较大,而数组长度n较小,即k>>n时,辅助数组C[k+1]的空间消耗较大。

以上这篇基于python进行桶排序与基数排序的总结就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python列出目录下指定文件与子目录的方法
Jul 03 Python
浅谈django开发者模式中的autoreload是如何实现的
Aug 18 Python
python监测当前联网状态并连接的实例
Dec 18 Python
python库matplotlib绘制坐标图
Oct 18 Python
解决python彩色螺旋线绘制引发的问题
Nov 23 Python
pyinstaller还原python代码过程图解
Jan 08 Python
解决Tensorflow 内存泄露问题
Feb 05 Python
基于Python爬取爱奇艺资源过程解析
Mar 02 Python
教你如何用python操作摄像头以及对视频流的处理
Oct 12 Python
python实现启动一个外部程序,并且不阻塞当前进程
Dec 05 Python
python将YUV420P文件转PNG图片格式的两种方法
Jan 22 Python
python 管理系统实现mysql交互的示例代码
Dec 06 Python
Vue的el-scrollbar实现自定义滚动
May 29 #Python
基于Django与ajax之间的json传输方法
May 29 #Python
django ajax json的实例代码
May 29 #Python
Python+selenium实现自动循环扔QQ邮箱漂流瓶
May 29 #Python
PyTorch学习笔记之回归实战
May 28 #Python
Django 使用Ajax进行前后台交互的示例讲解
May 28 #Python
Python实现爬虫爬取NBA数据功能示例
May 28 #Python
You might like
杏林同学录(五)
2006/10/09 PHP
php数组函数序列之array_search()- 按元素值返回键名
2011/11/04 PHP
PHP在linux上执行外部命令的方法
2017/02/06 PHP
浅谈PHP的排列组合(如输入a,b,c 输出他们的全部组合)
2017/03/14 PHP
利用webqq协议使用python登录qq发消息源码参考
2013/04/08 Javascript
JavaScript中的运算符种类及其规则介绍
2013/09/26 Javascript
常用的JavaScript验证正则表达式汇总
2013/11/26 Javascript
深入理解javascript严格模式(Strict Mode)
2014/11/28 Javascript
简单理解vue中el、template、replace元素
2016/10/27 Javascript
jQuery实现web页面樱花坠落的特效
2017/06/01 jQuery
vue自定义指令directive实例详解
2018/01/17 Javascript
详解使用React进行组件库开发
2018/02/06 Javascript
vue.js element-ui tree树形控件改iview的方法
2018/03/29 Javascript
nodejs更改项目端口号的方法
2018/05/13 NodeJs
layui多图上传实现删除功能的例子
2019/09/23 Javascript
leaflet加载geojson叠加显示功能代码
2020/02/21 Javascript
jQuery插件simplePagination的使用方法示例
2020/04/28 jQuery
JS数组push、unshift、pop、shift方法的实现与使用方法示例
2020/04/29 Javascript
JavaScript如何实现监听键盘输入和鼠标监点击
2020/07/20 Javascript
OpenLayers3实现图层控件功能
2020/09/25 Javascript
天翼开放平台免费短信验证码接口使用实例
2013/12/18 Python
对python numpy数组中冒号的使用方法详解
2018/04/17 Python
python定时按日期备份MySQL数据并压缩
2019/04/19 Python
python写入文件自动换行问题的方法
2019/07/05 Python
win10安装tensorflow-gpu1.8.0详细完整步骤
2020/01/20 Python
Django用数据库表反向生成models类知识点详解
2020/03/25 Python
python中lower函数实现方法及用法讲解
2020/12/23 Python
MCM英国官网:奢侈皮具制品
2017/04/18 全球购物
美国婚礼礼品网站:MyWeddingFavors
2018/09/26 全球购物
英国老牌潮鞋店:Offspring
2019/08/19 全球购物
什么是重载?CTS、CLS和CLR分别做何解释
2012/05/06 面试题
给水工程专业毕业生自荐信
2014/01/28 职场文书
2014学习全国两会精神心得体会2000字
2014/03/11 职场文书
4s店市场专员岗位职责
2014/04/09 职场文书
解除财产保全担保书
2014/05/20 职场文书
2014年客房服务员工作总结
2014/11/18 职场文书