基于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使用多线程不断刷新网页的方法
Mar 31 Python
以Flask为例讲解Python的框架的使用方法
Apr 29 Python
python利用urllib和urllib2访问http的GET/POST详解
Sep 27 Python
python numpy 一维数组转变为多维数组的实例
Jul 02 Python
celery4+django2定时任务的实现代码
Dec 23 Python
python pandas库的安装和创建
Jan 10 Python
python日志logging模块使用方法分析
May 23 Python
Django中间件基础用法详解
Jul 18 Python
django 单表操作实例详解
Jul 30 Python
python实现在一个画布上画多个子图
Jan 19 Python
python实现超级玛丽游戏
Mar 18 Python
Jupyter Notebook 实现正常显示中文和负号
Apr 24 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
解析PHP中的内存管理,PHP动态分配和释放内存
2013/06/28 PHP
php使用curl获取header检测开启GZip压缩的方法
2018/08/15 PHP
PHP PDOStatement::fetchColumn讲解
2019/01/31 PHP
jQuery 改变CSS样式基础代码
2010/02/11 Javascript
用jquery实现等比例缩放图片效果插件
2010/07/24 Javascript
javascript权威指南 学习笔记之null和undefined
2011/09/25 Javascript
jquery如何判断表格同一列不同行input数据是否重复
2014/05/14 Javascript
详细讲解JavaScript中的this绑定
2016/10/10 Javascript
AngularJS定时器的使用与移除操作方法【interval与timeout】
2016/12/14 Javascript
微信小程序的动画效果详解
2017/01/18 Javascript
html+javascript+bootstrap实现层级多选框全层全选和多选功能
2017/03/09 Javascript
Nodejs中使用captchapng模块生成图片验证码
2017/05/18 NodeJs
Node.js  事件循环详解及实例
2017/08/06 Javascript
详解node child_process模块学习笔记
2018/01/24 Javascript
深入理解js A*寻路算法原理与具体实现过程
2018/12/13 Javascript
Vue.js中该如何自己维护路由跳转记录
2019/05/19 Javascript
解决微信授权成功后点击按返回键出现空白页和报错的问题
2020/06/08 Javascript
vue router-link 默认a标签去除下划线的实现
2020/11/06 Javascript
JavaScript代码实现简单计算器
2020/12/27 Javascript
Python实现监控程序执行时间并将其写入日志的方法
2015/06/30 Python
详解python时间模块中的datetime模块
2016/01/13 Python
Python多线程、异步+多进程爬虫实现代码
2016/02/17 Python
Python使用defaultdict读取文件各列的方法
2017/05/11 Python
详解从Django Rest Framework响应中删除空字段
2019/01/11 Python
numpy.random模块用法总结
2019/05/27 Python
Django 反向生成url实例详解
2019/07/30 Python
Python @property装饰器原理解析
2020/01/22 Python
浅析Python 多行匹配模式
2020/07/24 Python
Python3.9最新版下载与安装图文教程详解(Windows系统为例)
2020/11/28 Python
CSS3教程(6):创建网站多列
2009/04/02 HTML / CSS
CSS3制作缩略图的详细过程
2016/07/08 HTML / CSS
捷克多品牌在线时尚商店:ANSWEAR.cz
2020/10/03 全球购物
活动总结报告怎么写
2014/07/03 职场文书
2014年学生会干事工作总结
2014/11/07 职场文书
三八节活动主持词
2015/07/04 职场文书
公司员工宿舍管理制度
2015/08/07 职场文书