基于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之list和str比较
Sep 20 Python
17个Python小技巧分享
Jan 23 Python
Python机器学习之SVM支持向量机
Dec 27 Python
Python实现PS图像明亮度调整效果示例
Jan 23 Python
python 通过logging写入日志到文件和控制台的实例
Apr 28 Python
[原创]Python入门教程4. 元组基本操作
Oct 31 Python
使用TensorFlow实现简单线性回归模型
Jul 19 Python
Python中模块(Module)和包(Package)的区别详解
Aug 07 Python
如何将 awk 脚本移植到 Python
Dec 09 Python
Python利用逻辑回归模型解决MNIST手写数字识别问题详解
Jan 14 Python
教你如何用python开发一款数字推盘小游戏
Apr 14 Python
python中如何对多变量连续赋值
Jun 03 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
《DOTA3》开发工作已经开始 《DOTA3》将代替《DOTA2》
2021/03/06 DOTA
PHP 高手之路(三)
2006/10/09 PHP
PHP判断网络文件是否存在的方法
2015/03/12 PHP
简要剖析PHP的Yii框架的组件化机制的基本知识
2016/03/17 PHP
自定义min版smarty模板引擎MinSmarty.class.php文件及用法
2016/05/20 PHP
ThinkPHP实现更新数据实例详解(demo)
2016/06/29 PHP
php删除一个路径下的所有文件夹和文件的方法
2018/02/07 PHP
PHP面向对象之里氏替换原则简单示例
2018/04/08 PHP
php支付宝系列之电脑网站支付
2018/05/30 PHP
让任务管理器中的CPU跳舞的js代码
2008/11/01 Javascript
Jquery 自定义动画概述及示例
2013/03/29 Javascript
常见表单重复提交问题整理及解决方法
2013/11/13 Javascript
JS 屏蔽按键效果与改变按键效果的示例代码
2013/12/24 Javascript
轻松学习jQuery插件EasyUI EasyUI创建树形网络(1)
2015/11/30 Javascript
js提取中文拼音首字母的封装工具类
2018/03/12 Javascript
webpack4.x CommonJS模块化浅析
2018/11/09 Javascript
浅谈JavaScript_DOM学习篇_图片切换小案例
2019/03/19 Javascript
教你搭建按需加载的Vue组件库(小结)
2019/07/29 Javascript
[01:35]2014DOTA2西雅图邀请赛 专访狐狸妈青春献给刀塔
2014/07/08 DOTA
分享一下Python数据分析常用的8款工具
2018/04/29 Python
对Django项目中的ORM映射与模糊查询的使用详解
2019/07/18 Python
python super的使用方法及实例详解
2019/09/25 Python
解决django migrate报错ORA-02000: missing ALWAYS keyword
2020/07/02 Python
Python threading模块condition原理及运行流程详解
2020/10/05 Python
jupyter notebook远程访问不了的问题解决方法
2021/01/11 Python
Joe Fresh官网:加拿大时尚品牌和零售连锁店
2016/11/30 全球购物
FC-Moto瑞典:欧洲最大的摩托车服装和头盔商店之一
2018/11/27 全球购物
美国在线宠物商店:Chewy
2019/01/12 全球购物
Unineed中文官网:高端护肤美妆与时尚配饰,英国直邮
2020/07/23 全球购物
销售自荐信
2013/10/22 职场文书
汉语言文学毕业生自荐信范文
2014/03/24 职场文书
应届硕士毕业生自荐信
2014/05/26 职场文书
音乐教师个人总结
2015/02/06 职场文书
2015年三万活动总结
2015/03/25 职场文书
《比尾巴》教学反思
2016/02/24 职场文书
Python数据分析入门之数据读取与存储
2021/05/13 Python