基于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字符串和文件操作常用函数分析
Apr 08 Python
python实现的简单抽奖系统实例
May 22 Python
使用pdb模块调试Python程序实例
Jun 02 Python
Django的信号机制详解
May 05 Python
python实现TF-IDF算法解析
Jan 02 Python
python3 selenium 切换窗口的几种方法小结
May 21 Python
python爬取cnvd漏洞库信息的实例
Feb 14 Python
python实现微信防撤回神器
Apr 29 Python
Python中单线程、多线程和多进程的效率对比实验实例
May 14 Python
python占位符输入方式实例
May 27 Python
python request 模块详细介绍
Nov 10 Python
python基础之函数的定义和调用
Oct 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基础知识:类与对象(1)
2006/12/13 PHP
9个实用的PHP代码片段分享
2015/01/22 PHP
laravel 错误处理,接口错误返回json代码
2019/10/25 PHP
js浮点数保留两位小数点示例代码(四舍五入)
2013/12/26 Javascript
如何设置一定时间内只能发送一次请求
2014/02/28 Javascript
jQuery中children()方法用法实例
2015/01/07 Javascript
JavaScript操作URL的相关内容集锦
2015/10/29 Javascript
js实现拖拽效果(构造函数)
2015/12/14 Javascript
jQuery实现立体式数字滚动条增加效果
2016/12/21 Javascript
jQuery插件HighCharts实现2D柱状图、折线图的组合多轴图效果示例【附demo源码下载】
2017/03/09 Javascript
详解通过JSON数据使用VUE.JS
2017/05/26 Javascript
JS表单提交验证、input(type=number) 去三角 刷新验证码
2017/06/21 Javascript
node使用Mongoose类库实现简单的增删改查
2018/11/08 Javascript
vue路由教程之静态路由
2019/09/03 Javascript
vue跳转同一个组件,参数不同,页面接收值只接收一次的解决方法
2019/11/05 Javascript
[44:26]DOTA2上海特级锦标赛主赛事日 - 2 胜者组第一轮#4EG VS Fnatic第二局
2016/03/03 DOTA
[02:01]2018完美盛典-开场舞《双子星》
2018/12/16 DOTA
Python的一些用法分享
2012/10/07 Python
windows环境下tensorflow安装过程详解
2018/03/30 Python
用Python实现校园通知更新提醒功能
2019/11/23 Python
详解Python的三种拷贝方式
2020/02/11 Python
解决Tensorflow2.0 tf.keras.Model.load_weights() 报错处理问题
2020/06/12 Python
PyCharm中配置PySide2的图文教程
2020/06/18 Python
草莓网化妆品加拿大网站:Strawberrynet Canada
2016/09/20 全球购物
美国性感女装网站:bebe
2017/03/04 全球购物
写出SQL四条最基本的数据操作语句(DML)
2012/12/12 面试题
资深财务管理人员自我评价
2013/09/22 职场文书
秋季运动会通讯稿
2014/01/24 职场文书
校运会广播稿100字
2014/01/27 职场文书
阿德的梦教学反思
2014/02/06 职场文书
项目合作意向书范本
2014/04/01 职场文书
放飞梦想演讲稿200字
2014/08/26 职场文书
全国优秀教师事迹材料
2014/08/26 职场文书
2019学生会干事辞职信
2019/06/27 职场文书
2019年描写人生经典诗句大全
2019/07/08 职场文书
java中为什么说子类的构造方法默认访问的是父类的无参构造方法
2022/04/13 Java/Android