Python数据结构与算法之常见的分配排序法示例【桶排序与基数排序】


Posted in Python onDecember 15, 2017

本文实例讲述了Python数据结构与算法之常见的分配排序法。分享给大家供大家参考,具体如下:

箱排序(桶排序)

箱排序是根据关键字的取值范围1~m,预先建立m个箱子,箱排序要求关键字类型为有限类型,可能会有无限个箱子,实用价值不大,一般用于基数排序的中间过程。

桶排序是箱排序的实用化变种,其对数据集的范围,如[0,1) 进行划分为n个大小相同的子区间,每一个子区间为一个桶,然后将n非记录分配到各桶中。因为关键字序列是均匀分布在[0,1)上的,所以一般不会有很多记录落入同一个桶中。

以下的桶排序方法采用字典实现,所以对于整数类型,并不需要建立多余空间

def BuckSort(A):
 bucks = dict()  # 桶
 for i in A:
  bucks.setdefault(i,[]) # 每个桶默认为空列表
  bucks[i].append(i)  # 往对应的桶中添加元素
 A_sort = []
 for i in range(min(A), max(A)+1):
  if i in bucks:     # 检查是否存在对应数字的桶
   A_sort.extend(bucks[i])  # 合并桶中数据
 return A_sort

基数排序

# 基数排序
# 输入:待排序数组s, keysize关键字位数, 亦即装箱次数, radix基数
def RadixSort(s, keysize=4, radix=10):
 # 按关键字的第k分量进行分配 k = 4,3,2,1
 def distribute(s,k):
  box = {r:[] for r in range(radix)}  # 分配用的空箱子
  for item in s:   # 依次扫描s[],将其装箱
   t = item
   t /= 10**(k-1)
   t %= 10    # 去关键字第k位
   box[t].append(item)
  return box
 # 按分配结果重新排列数据
 def collect(s,box):
  a = 0
  for i in range(radix):
   s[a:a + len(box[i])] = box[i][:] # 将箱子中元素的合并,覆盖到原来的数组中
   a += len(box[i])     # 增加偏移值
 # 核心算法
 for k in range(1,keysize+1):
  box = distribute(s,k)   # 按基数分配
  collect(s,box)     # 按分配结果拼合

以下摘自:《数据结构与算法——理论与实践》

基数排序可以拓展为按多关键字排序,如对扑克牌按花色、按点数排序。
一般地,设线性表有那个待排序元素,每个元素包含d个关键字{k1,k2,...,kd},则该线性表对关键字有序指,对于线性表中任意两个元素r[i]和r[j],1<=i<=j<=n,都满足下列有序关系:

{k1i,k2i,...,kdi} < {k1j,k2j,...,kdj}
其中k1称为最主位关键字,kd称为最次位关键字
其排序方法分两种:最高位优先MSD(most significant digit frist)与最低位优先LSD(least significant digit first)

MSD: 先按k1排序分组,同一组的个元素,若关键字k1相等,再对各组按k2排序分成子组,依次类推,直到最次位kd对各子组排序后,再将各组链接起来。

LSD: 与MSD相反,先按kd排序,再对kd-1排序,依次类推。

Python 相关文章推荐
python获得linux下所有挂载点(mount points)的方法
Apr 29 Python
Ubuntu安装Jupyter Notebook教程
Oct 18 Python
不知道这5种下划线的含义,你就不算真的会Python!
Oct 09 Python
python中metaclass原理与用法详解
Jun 25 Python
python导入不同目录下的自定义模块过程解析
Nov 18 Python
Python使用Turtle库绘制一棵西兰花
Nov 23 Python
Python run()函数和start()函数的比较和差别介绍
May 03 Python
Python实现Keras搭建神经网络训练分类模型教程
Jun 12 Python
深入了解NumPy 高级索引
Jul 24 Python
python中openpyxl和xlsxwriter对Excel的操作方法
Mar 01 Python
python 将Excel转Word的示例
Mar 02 Python
仅用几行Python代码就能复制她的U盘文件?
Jun 26 Python
numpy自动生成数组详解
Dec 15 #Python
Python3实现发送QQ邮件功能(附件)
Dec 23 #Python
numpy排序与集合运算用法示例
Dec 15 #Python
Python3实现发送QQ邮件功能(html)
Dec 15 #Python
Python3实现发送QQ邮件功能(文本)
Dec 15 #Python
numpy数组拼接简单示例
Dec 15 #Python
浅谈numpy数组的几种排序方式
Dec 15 #Python
You might like
第三节 定义一个类 [3]
2006/10/09 PHP
PHP高级编程实例:编写守护进程
2014/09/02 PHP
PHP中UNIX时间戳和日期间的转换与计算实例
2014/11/19 PHP
PHP 表单提交及处理表单数据详解及实例
2016/12/27 PHP
thinkphp5引入公共部分header、footer的方法详解
2018/09/14 PHP
JavaScript 学习笔记之一jQuery写法图片等比缩放以及预加载
2012/06/28 Javascript
js实现横向伸展开的二级导航菜单代码
2015/08/28 Javascript
JS实现黑色大气的二级导航菜单效果
2015/09/18 Javascript
JavaScript实现数据类型的相互转换
2016/03/06 Javascript
javascript数组对象常用api函数小结(连接,插入,删除,反转,排序等)
2016/09/20 Javascript
js链表操作(实例讲解)
2017/08/29 Javascript
写给vue新手们的vue渲染页面教程
2017/09/01 Javascript
vue.js内置组件之keep-alive组件使用
2018/07/10 Javascript
Vue.js计算机属性computed和methods方法详解
2019/10/12 Javascript
用webAPI实现图片放大镜效果
2020/11/23 Javascript
python模拟登录百度代码分享(获取百度贴吧等级)
2013/12/27 Python
python使用正则表达式的search()函数实现指定位置搜索功能
2017/11/10 Python
Python实现Pig Latin小游戏实例代码
2018/02/02 Python
Python 识别12306图片验证码物品的实现示例
2020/01/20 Python
如何基于Python代码实现高精度免费OCR工具
2020/06/18 Python
英国浴室洗脸盆购物网站:Click Basin
2018/06/08 全球购物
吉列剃须刀英国官网:Gillette英国
2019/03/28 全球购物
工程造价管理专业大专生求职信
2013/10/06 职场文书
护理专科毕业推荐信
2013/11/10 职场文书
《在大海中永生》教学反思
2014/02/24 职场文书
我们的节日端午节活动方案
2014/03/02 职场文书
后勤服务中心总经理工作职责
2014/03/03 职场文书
企业整改报告范文
2014/11/08 职场文书
收银员岗位职责
2015/02/03 职场文书
2015感人爱情寄语
2015/02/26 职场文书
2015年小学图书室工作总结
2015/05/18 职场文书
2015年度考核个人工作总结
2015/10/24 职场文书
小学生大队委竞选稿
2015/11/20 职场文书
企业廉洁教育心得体会
2016/01/20 职场文书
Mysql 性能监控及调优
2021/04/06 MySQL
Redis基本数据类型List常用操作命令
2022/06/01 Redis