基于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 13 Python
Python的批量远程管理和部署工具Fabric用法实例
Jan 23 Python
python使用urllib2提交http post请求的方法
May 26 Python
Python解惑之整数比较详解
Apr 24 Python
python SSH模块登录,远程机执行shell命令实例解析
Jan 12 Python
Python使用gRPC传输协议教程
Oct 16 Python
Python比较配置文件的方法实例详解
Jun 06 Python
使用django的ORM框架按月统计近一年内的数据方法
Jul 18 Python
python实现提取str字符串/json中多级目录下的某个值
Feb 27 Python
python使用opencv resize图像不进行插值的操作
Jul 05 Python
Python爬虫入门案例之爬取二手房源数据
Oct 16 Python
python playwright之元素定位示例详解
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
PHP中通过语义URL防止网站被攻击的方法分享
2011/09/08 PHP
PHP5中Cookie与 Session使用详解
2013/04/30 PHP
ThinkPHP实现图片上传操作的方法详解
2017/05/08 PHP
PHP ElasticSearch做搜索实例讲解
2020/02/05 PHP
JS函数验证总结(方便js客户端输入验证)
2010/10/29 Javascript
JavaScript的21条基本知识点
2014/03/04 Javascript
运用jQuery定时器的原理实现banner图片切换
2014/10/22 Javascript
jQuery实现的导航动画效果(附demo源码)
2016/04/01 Javascript
基于jquery插件实现拖拽删除图片功能
2020/08/27 Javascript
基于JS实现密码框(password)中显示文字提示功能代码
2016/05/27 Javascript
JS简单实现滑动加载数据的方法示例
2017/10/18 Javascript
angularjs 动态从后台获取下拉框的值方法
2018/08/13 Javascript
vue-router的钩子函数用法实例分析
2019/10/26 Javascript
javaScript 实现重复输出给定的字符串的常用方法小结
2020/02/20 Javascript
Vue 中获取当前时间并实时刷新的实现代码
2020/05/12 Javascript
解决vue动态路由异步加载import组件,加载不到module的问题
2020/07/26 Javascript
[02:53]DOTA2亚洲邀请赛 NewBee战队巡礼
2015/02/03 DOTA
python实现无证书加密解密实例
2014/10/27 Python
使用Python编写vim插件的简单示例
2015/04/17 Python
python实现k-means聚类算法
2018/02/23 Python
python3获取当前文件的上一级目录实例
2018/04/26 Python
Python之修改图片像素值的方法
2019/07/03 Python
Django ModelForm操作及验证方式
2020/03/30 Python
详解python如何引用包package
2020/06/07 Python
韩国CJ食品专卖网:CJonmart
2016/09/11 全球购物
Sneaker Studio捷克:购买运动鞋
2018/07/08 全球购物
优质有机椰子产品:Dr. Goerg
2019/09/24 全球购物
员工晚婚的请假条
2014/02/08 职场文书
信息管理专业自荐书
2014/06/05 职场文书
运动会广播稿诗歌版
2014/09/12 职场文书
学校党的群众路线教育实践活动制度建设计划
2014/11/03 职场文书
教师个人工作总结范文2014
2014/11/10 职场文书
教师听课评语大全
2014/12/31 职场文书
小学生纪律委员竞选稿
2015/11/19 职场文书
pycharm 如何查看某一函数源码的快捷键
2021/05/12 Python
Python pyecharts案例超市4年数据可视化分析
2022/08/14 Python