基于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 正则式 概述及常用字符
May 07 Python
Python两个整数相除得到浮点数值的方法
Mar 18 Python
Python中不同进制的语法及转换方法分析
Jul 27 Python
[原创]Python入门教程3. 列表基本操作【定义、运算、常用函数】
Oct 30 Python
详解Python字符串切片
May 20 Python
python实现文件的备份流程详解
Jun 18 Python
python通过链接抓取网站详解
Nov 20 Python
python实现银行实战系统
Feb 26 Python
浅谈OpenCV中的新函数connectedComponentsWithStats用法
Jul 05 Python
Python爬取梨视频的示例
Jan 29 Python
pytorch损失反向传播后梯度为none的问题
May 12 Python
python中Pyqt5使用Qlabel标签播放视频
Apr 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面向对象全攻略 (四)构造方法与析构方法
2009/09/30 PHP
深入PHP与浏览器缓存的分析
2013/06/03 PHP
Laravel中GraphQL接口请求频率实战记录
2020/09/01 PHP
JavaScript 继承详解(四)
2009/07/13 Javascript
js获取图片长和宽度的代码
2009/11/24 Javascript
三级下拉菜单的js实现代码
2011/05/23 Javascript
JS返回上一页实例代码通过图片和按钮分别实现
2013/08/16 Javascript
jqueyr判断checkbox组的选中(示例代码)
2013/11/08 Javascript
jquery实现在光标位置插入内容的方法
2015/02/05 Javascript
在Ubuntu系统上安装Node.JS的教程
2015/10/15 Javascript
websocket+node.js实现实时聊天系统问题咨询
2017/05/17 Javascript
bootstrap模态框远程示例代码分享
2017/05/22 Javascript
自制简易打赏功能的实例
2017/09/02 Javascript
浅谈Vue Element中Select下拉框选取值的问题
2018/03/01 Javascript
微信小程序methods中定义的方法互相调用的实例代码
2018/08/07 Javascript
解决layui数据表格table的横向滚动条显示问题
2019/09/04 Javascript
vue-cli设置css不生效的解决方法
2020/02/07 Javascript
如何在vue 中引入使用jquery
2020/11/10 jQuery
小程序自定义圆形进度条
2020/11/17 Javascript
vue-cli 3如何使用vue-bootstrap-datetimepicker日期插件
2021/02/20 Vue.js
[08:08]2014DOTA2国际邀请赛中国区预选赛精彩TOPPLAY
2014/06/25 DOTA
[43:14]Liquid vs Optic 2018国际邀请赛淘汰赛BO3 第二场 8.21
2018/08/22 DOTA
一波神奇的Python语句、函数与方法的使用技巧总结
2015/12/08 Python
python模块之time模块(实例讲解)
2017/09/13 Python
使用requests库制作Python爬虫
2018/03/25 Python
java中两个byte数组实现合并的示例
2018/05/09 Python
Python一个简单的通信程序(客户端 服务器)
2019/03/06 Python
python 中pyqt5 树节点点击实现多窗口切换问题
2019/07/04 Python
Tensorflow获取张量Tensor的具体维数实例
2020/01/19 Python
如何使用pandas读取txt文件中指定的列(有无标题)
2020/03/05 Python
Python yield生成器和return对比代码实例
2020/04/20 Python
英国探险旅游专家:Explore
2018/12/20 全球购物
经典优秀个人求职自荐信格式
2013/09/25 职场文书
水产养殖学应届生求职信
2013/09/29 职场文书
先进工作者获奖感言
2014/02/08 职场文书
2014年幼儿园教师工作总结
2014/11/08 职场文书