基于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 参数列表中的self 显式不等于冗余
Dec 01 Python
Python实现的二维码生成小软件
Jul 11 Python
Python算术运算符实例详解
May 31 Python
老生常谈Python基础之字符编码
Jun 14 Python
Python 操作文件的基本方法总结
Aug 10 Python
python简单实现操作Mysql数据库
Jan 29 Python
python中实现数组和列表读取一列的方法
Apr 03 Python
python中的colorlog库使用详解
Jul 05 Python
扩展Django admin的list_filter()可使用范围方法
Aug 21 Python
解决django无法访问本地static文件(js,css,img)网页里js,cs都加载不了
Apr 07 Python
查看keras的默认backend实现方式
Jun 19 Python
python+opencv3.4.0 实现HOG+SVM行人检测的示例代码
Jan 28 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多个文件及图片上传实例详解
2014/11/10 PHP
php创建桌面快捷方式实现方法
2015/12/31 PHP
Yii2 rbac权限控制操作步骤实例教程
2016/04/29 PHP
php 输入输出流详解及示例代码
2016/08/25 PHP
php反序列化长度变化尾部字符串逃逸(0CTF-2016-piapiapia)
2020/02/15 PHP
PHP autoload使用方法及步骤详解
2020/09/05 PHP
DHTML Slide Show script图片轮换
2008/03/03 Javascript
jquery实现兼容IE8的异步上传文件
2015/06/15 Javascript
javascript封装addLoadEvent实现页面同时加载执行多个函数的方法
2016/07/25 Javascript
JS中正则表达式要注意lastIndex属性
2017/08/08 Javascript
Bootstrap模态对话框中显示动态内容的方法
2018/08/10 Javascript
jQuery md5加密插件jQuery.md5.js用法示例
2018/08/24 jQuery
vue-cli webpack配置文件分析
2019/05/20 Javascript
一篇文章介绍redux、react-redux、redux-saga总结
2019/05/23 Javascript
vue实现图片懒加载的方法分析
2020/02/05 Javascript
python time模块用法实例详解
2014/09/11 Python
Python中str is not callable问题详解及解决办法
2017/02/10 Python
对命令行模式与python交互模式介绍
2018/05/12 Python
Python中return self的用法详解
2018/07/27 Python
python读取csv和txt数据转换成向量的实例
2019/02/12 Python
python 实现图像快速替换某种颜色
2020/06/04 Python
Python实现壁纸下载与轮换
2020/10/19 Python
让IE6、IE7、IE8支持CSS3的脚本
2010/07/20 HTML / CSS
护理专业自荐信范文
2014/02/26 职场文书
毕业留言寄语大全
2014/04/10 职场文书
信用社主任竞聘演讲稿
2014/05/23 职场文书
出纳试用期自我鉴定范文
2014/09/16 职场文书
2014年校长工作总结
2014/12/11 职场文书
华清池导游词
2015/02/02 职场文书
2015年度班主任自我评价
2015/03/11 职场文书
五星级酒店宣传口号
2015/12/25 职场文书
css3实现背景图片半透明内容不透明的方法示例
2021/04/13 HTML / CSS
python中pycryto实现数据加密
2022/04/29 Python
德生2P3收音机开箱评测
2022/04/30 无线电
MySQL数据库安装方法与图形化管理工具介绍
2022/05/30 MySQL
从原生JavaScript到React深入理解
2022/07/23 Javascript