基于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的Django框架中的模版继承
Jul 16 Python
浅述python中argsort()函数的实例用法
Mar 30 Python
Django项目中包含多个应用时对url的配置方法
May 30 Python
Python使用pylab库实现绘制直方图功能示例
Jun 01 Python
OPENCV去除小连通区域,去除孔洞的实例讲解
Jun 21 Python
Python实现随机漫步功能
Jul 09 Python
浅谈Python中的bs4基础
Oct 21 Python
Anaconda和ipython环境适配的实现
Apr 22 Python
基于python3.7利用Motor来异步读写Mongodb提高效率(推荐)
Apr 29 Python
Python约瑟夫生者死者小游戏实例讲解
Jan 04 Python
pytorch 实现L2和L1正则化regularization的操作
Mar 03 Python
OpenCV中resize函数插值算法的实现过程(五种)
Jun 05 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 strstr 函数判断字符串是否否存在的实例代码
2013/09/28 PHP
Laravel配合jwt使用的方法实例
2020/10/25 PHP
js 获取中文拼音,Select自动匹配字母获取值的代码
2009/09/23 Javascript
用JS实现一个TreeMenu效果分享
2011/08/28 Javascript
基于jquery可配置循环左右滚动例子
2011/09/09 Javascript
JavaScript中的undefined学习总结
2013/11/30 Javascript
AngularJS中如何使用$parse或$eval在运行时对Scope变量赋值
2016/01/25 Javascript
JavaScript定时器实现的原理分析
2016/12/06 Javascript
AngularJS使用ocLazyLoad实现js延迟加载
2017/07/05 Javascript
微信小程序 共用变量值的实现
2017/07/12 Javascript
vue利用axios来完成数据的交互
2018/03/23 Javascript
关于AngularJS中ng-repeat不更新视图的解决方法
2018/09/30 Javascript
Node.js npm命令运行node.js脚本的方法
2018/10/10 Javascript
微信小程序移动拖拽视图-movable-view实例详解
2019/08/17 Javascript
Python中的hypot()方法使用简介
2015/05/18 Python
RC4文件加密的python实现方法
2015/06/30 Python
Python实现按学生年龄排序的实际问题详解
2017/08/29 Python
python 通过xml获取测试节点和属性的实例
2018/03/31 Python
元组列表字典(莫烦python基础)
2019/04/03 Python
Python中的list与tuple集合区别解析
2019/10/12 Python
tensorboard 可以显示graph,却不能显示scalar的解决方式
2020/02/15 Python
Python实现封装打包自己写的代码,被python import
2020/07/12 Python
QT5 Designer 打不开的问题及解决方法
2020/08/20 Python
Python调用飞书发送消息的示例
2020/11/10 Python
python爬虫基础之urllib的使用
2020/12/31 Python
HTML5重塑Web世界它将如何改变互联网
2012/12/17 HTML / CSS
html5 初试 indexedDB(推荐)
2016/07/21 HTML / CSS
莫斯科绝对前卫最秘密的商店:SVMoscow
2017/10/23 全球购物
数以千计的折扣工业产品:ESE Direct
2018/05/20 全球购物
BASIC HOUSE官方旗舰店:韩国著名的服装品牌
2018/09/27 全球购物
大学毕业感言50字
2014/02/07 职场文书
教师节感谢信
2015/01/22 职场文书
《合作意向书》怎么写?
2019/08/20 职场文书
python 利用PyAutoGUI快速构建自动化操作脚本
2021/05/31 Python
详解JAVA中的OPTIONAL
2021/06/14 Java/Android
JVM钩子函数的使用场景详解
2021/08/23 Java/Android