基于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字符串逐字符或逐词反转方法
May 21 Python
TensorFlow实现AutoEncoder自编码器
Mar 09 Python
python之DataFrame实现excel合并单元格
Feb 22 Python
python之django母板页面的使用
Jul 03 Python
python3使用matplotlib绘制散点图
Mar 19 Python
Python+opencv 实现图片文字的分割的方法示例
Jul 04 Python
python设置环境变量的作用和实例
Jul 09 Python
python实现用户名密码校验
Mar 18 Python
3种适用于Python的疯狂秘密武器及原因解析
Apr 29 Python
Python 如何批量更新已安装的库
May 26 Python
python连接mongodb数据库操作数据示例
Nov 30 Python
Python中的 No Module named ***问题及解决
Jul 23 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
PHP4中session登录页面的应用
2008/07/25 PHP
利用PHP将图片转换成base64编码的实现方法
2016/09/13 PHP
详解PHP处理字符串类似indexof的方法函数
2017/06/11 PHP
【经验总结】编写JavaScript代码时应遵循的14条规律
2016/06/20 Javascript
详解通过JSON数据使用VUE.JS
2017/05/26 Javascript
react-native组件中NavigatorIOS和ListView结合使用的方法
2017/09/30 Javascript
vue better-scroll插件使用详解
2018/01/25 Javascript
Vuejs在v-for中,利用index来对第一项添加class的方法
2018/03/03 Javascript
Vue安装浏览器开发工具的步骤详解
2019/05/12 Javascript
Nodejs监控事件循环异常示例详解
2019/09/22 NodeJs
微信小程序列表时间戳转换实现过程解析
2019/10/12 Javascript
vue中使用echarts的示例
2021/01/03 Vue.js
python通过线程实现定时器timer的方法
2015/03/16 Python
对于Python编程中一些重用与缩减的建议
2015/04/14 Python
Python while、for、生成器、列表推导等语句的执行效率测试
2015/06/03 Python
请不要重复犯我在学习Python和Linux系统上的错误
2016/12/12 Python
python中异常捕获方法详解
2017/03/03 Python
matplotlib设置legend图例代码示例
2017/12/19 Python
python用户管理系统的实例讲解
2017/12/23 Python
Python Web编程之WSGI协议简介
2018/07/18 Python
Python多进程与服务器并发原理及用法实例分析
2018/08/21 Python
在IPython中进行Python程序执行时间的测量方法
2018/11/01 Python
Python实现个人微信号自动监控告警的示例
2019/07/03 Python
python连接mongodb集群方法详解
2020/02/13 Python
如何打包Python Web项目实现免安装一键启动的方法
2020/05/21 Python
python中的split、rsplit、splitlines用法说明
2020/10/23 Python
html5+css3之CSS中的布局与Header的实现
2014/11/21 HTML / CSS
璀璨的珍珠、密钉和个性化珠宝:Lily & Roo
2021/01/21 全球购物
专科毕业生求职简历的自我评价
2013/10/12 职场文书
普师专业个人自荐信范文
2013/11/26 职场文书
体育教育个人自荐信范文
2013/12/01 职场文书
护理专业求职信
2014/06/15 职场文书
法院个人总结
2015/03/03 职场文书
react中的DOM操作实现
2021/06/30 Javascript
Nginx文件已经存在全局反向代理问题排查记录
2022/07/15 Servers
SQLyog的下载、安装、破解、配置教程(MySQL可视化工具安装)
2022/09/23 MySQL