基于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实现的HTTP并发测试完整示例
Apr 23 Python
Python针对给定列表中元素进行翻转操作的方法分析
Apr 27 Python
python 字符串只保留汉字的方法
Nov 16 Python
python实现QQ邮箱/163邮箱的邮件发送
Jan 22 Python
从0开始的Python学习014面向对象编程(推荐)
Apr 02 Python
python类的实例化问题解决
Aug 31 Python
细数nn.BCELoss与nn.CrossEntropyLoss的区别
Feb 29 Python
Python paramiko 模块浅谈与SSH主要功能模拟解析
Feb 29 Python
python matplotlib实现将图例放在图外
Apr 17 Python
基于Python实现全自动下载抖音视频
Nov 06 Python
python实现定时发送邮件
Dec 23 Python
基于Python实现一个春节倒计时脚本
Jan 22 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中查询SQL Server或Sybase时TEXT字段被截断的解决方法
2009/03/10 PHP
解析php做推送服务端实现ios消息推送
2013/07/01 PHP
thinkphp实现图片上传功能分享
2014/03/04 PHP
Laravel中扩展Memcached缓存驱动实现使用阿里云OCS缓存
2015/02/10 PHP
Zend Framework开发入门经典教程
2016/03/23 PHP
php 截取utf-8格式的字符串实例代码
2016/10/30 PHP
thinkPHP简单实现多个子查询语句的方法
2016/12/05 PHP
360搜索引擎自动收录php改写方案
2018/04/28 PHP
Laravel框架使用Redis的方法详解
2018/05/30 PHP
PHP实现通过二维数组键值获取一维键名操作示例
2019/10/11 PHP
js单例模式的两种方案
2013/10/22 Javascript
chrome下jq width()方法取值为0的解决方法
2014/05/26 Javascript
AngularJS入门教程(二):AngularJS模板
2014/12/06 Javascript
原生js实现移动开发轮播图、相册滑动特效
2015/04/17 Javascript
vue拖拽排序插件vuedraggable使用方法详解
2020/08/21 Javascript
nodejs nedb 封装库与使用方法示例
2020/02/06 NodeJs
python自动化测试之从命令行运行测试用例with verbosity
2014/09/28 Python
Python中使用socket发送HTTP请求数据接收不完整问题解决方法
2015/02/04 Python
Python安装Numpy和matplotlib的方法(推荐)
2017/11/02 Python
python框架django项目部署相关知识详解
2019/11/04 Python
python实现电子词典
2020/03/03 Python
Python ellipsis 的用法详解
2020/11/20 Python
使用python将微信image下.dat文件解密为.png的方法
2020/11/30 Python
CSS3 画基本图形,圆形、椭圆形、三角形等
2016/09/20 HTML / CSS
巴西宠物商店:Cobasi
2019/04/19 全球购物
俄罗斯隐形眼镜和眼镜在线商店:Cronos
2020/06/02 全球购物
写自荐信要注意什么
2013/12/26 职场文书
即兴演讲稿
2014/01/04 职场文书
联谊会主持词
2014/03/26 职场文书
忠诚教育心得体会
2014/09/03 职场文书
工作失职造成投诉的检讨书范文
2014/10/05 职场文书
个人查摆剖析材料
2014/10/16 职场文书
幼儿学前班评语
2014/12/29 职场文书
汽车修理厂管理制度
2015/08/05 职场文书
解析目标检测之IoU
2021/06/26 Python
世界十大狙击步枪排行榜
2022/03/20 杂记