基于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标准异常和异常处理详解
Feb 02 Python
Python实现对字符串的加密解密方法示例
Apr 29 Python
Python实现XML文件解析的示例代码
Feb 05 Python
Python unittest 简单实现参数化的方法
Nov 30 Python
matplotlib.pyplot绘图显示控制方法
Jan 15 Python
Python学习笔记之Break和Continue用法分析
Aug 14 Python
Python Django模板之模板过滤器与自定义模板过滤器示例
Oct 18 Python
Python版中国省市经纬度
Feb 11 Python
Django REST 异常处理详解
Jul 15 Python
Python HTMLTestRunner如何下载生成报告
Sep 04 Python
VSCODE配置Markdown及Markdown基础语法详解
Jan 19 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中foreach循环中使用引用要注意的地方
2011/01/02 PHP
linux系统上支持php的 iconv()函数的方法
2011/10/01 PHP
PHP中使用sleep函数实现定时任务实例分享
2014/08/21 PHP
php根据数据id自动生成编号的实现方法
2016/10/16 PHP
php 多文件上传的实现实例
2016/10/23 PHP
Thinkphp框架中D方法与M方法的区别
2016/12/23 PHP
tp5框架内使用tp3.2分页的方法分析
2019/05/05 PHP
JavaScript 大数据相加的问题
2011/08/03 Javascript
使用Js让Html中特殊字符不被转义
2013/11/05 Javascript
JavaScript点击按钮后弹出透明浮动层的方法
2015/05/11 Javascript
Angularjs之filter过滤器(推荐)
2016/11/27 Javascript
微信小程序动态显示项目倒计时效果
2017/06/13 Javascript
详解微信小程序Radio选中样式切换
2017/07/06 Javascript
微信小程序picker组件下拉框选择input输入框的实例
2017/09/20 Javascript
jQuery实现的简单动态添加、删除表格功能示例
2017/09/21 jQuery
Grunt针对静态文件的压缩,版本控制打包的实例讲解
2017/09/29 Javascript
js中bool值的转换及“&&”、“||”、 “!!”详解
2017/12/21 Javascript
webpack引入eslint配置详解
2018/01/22 Javascript
js使用ajax传值给后台,后台返回字符串处理方法
2018/08/08 Javascript
基于aotu.js实现微信自动添加通讯录中的联系人功能
2020/05/28 Javascript
vue 实现在同一界面实现组件的动态添加和删除功能
2020/06/16 Javascript
微信小程序将页面按钮悬浮固定在底部的实现代码
2020/10/29 Javascript
Python实现提取文章摘要的方法
2015/04/21 Python
Python实现的简单算术游戏实例
2015/05/26 Python
python+opencv+caffe+摄像头做目标检测的实例代码
2018/08/03 Python
Python3爬虫学习之将爬取的信息保存到本地的方法详解
2018/12/12 Python
pycharm重命名文件的方法步骤
2019/07/29 Python
Django操作session 的方法
2020/03/09 Python
python Autopep8实现按PEP8风格自动排版Python代码
2021/03/02 Python
应届生护士求职信
2013/11/01 职场文书
自查自纠整改报告
2014/11/06 职场文书
2016国庆节活动宣传语
2015/11/25 职场文书
MySQL Router的安装部署
2021/04/24 MySQL
MySql开发之自动同步表结构
2021/05/28 MySQL
pytorch 预训练模型读取修改相关参数的填坑问题
2021/06/05 Python
教你使用TensorFlow2识别验证码
2021/06/11 Python