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中使用logging模块代替print(logging简明指南)
Jul 09 Python
python回调函数用法实例分析
May 09 Python
如何将python中的List转化成dictionary
Aug 15 Python
详解Python中最难理解的点-装饰器
Apr 03 Python
python执行系统命令后获取返回值的几种方式集合
May 12 Python
python 自动批量打开网页的示例
Feb 21 Python
Python中遍历列表的方法总结
Jun 27 Python
python 协程中的迭代器,生成器原理及应用实例详解
Oct 28 Python
Python响应对象text属性乱码解决方案
Mar 31 Python
解决Python中导入自己写的类,被划红线,但不影响执行的问题
Jul 13 Python
用python查找统一局域网下ip对应的mac地址
Jan 13 Python
基于tensorflow权重文件的解读
May 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
php实现利用phpexcel导出数据
2013/08/24 PHP
php数组操作之键名比较与差集、交集赋值的方法
2014/11/10 PHP
TP3.2.3框架使用CKeditor编辑器在页面中上传图片的方法分析
2019/12/31 PHP
node.js中的http.response.end方法使用说明
2014/12/14 Javascript
jQuery动态星级评分效果实现方法
2015/08/06 Javascript
jQuery实现的Tab滑动选项卡及图片切换(多种效果)小结
2015/09/14 Javascript
轻松学习jQuery插件EasyUI EasyUI创建树形网络(1)
2015/11/30 Javascript
js验证真实姓名与身份证号,手机号的简单实例
2016/07/18 Javascript
ReactNative-JS 调用原生方法实例代码
2016/10/08 Javascript
完美解决jQuery fancybox ie 无法显示关闭按钮的问题
2016/11/29 Javascript
BootStrap框架个人总结(bootstrap框架、导航条、下拉菜单、轮播广告carousel、栅格系统布局、标签页tabs、模态框、菜单定位)
2016/12/01 Javascript
浅谈js script标签中的预解析
2016/12/30 Javascript
微信小程序删除处理详解
2017/08/16 Javascript
nodejs简单实现TCP服务器端和客户端的聊天功能示例
2018/01/04 NodeJs
QQ跳转支付宝并自动领红包脚本(最新)
2018/06/22 Javascript
微信小程序使用template标签实现五星评分功能
2018/11/03 Javascript
详解从0开始搭建微信小程序(前后端)的全过程
2019/04/15 Javascript
JQuery常见节点操作实例分析
2019/05/15 jQuery
uni-app使用countdown插件实现倒计时
2020/11/01 Javascript
[56:17]NB vs Infamous 2019国际邀请赛淘汰赛 败者组 BO3 第三场 8.22
2019/09/05 DOTA
Python MySQLdb Linux下安装笔记
2015/05/09 Python
使用pandas对矢量化数据进行替换处理的方法
2018/04/11 Python
django 微信网页授权认证api的步骤详解
2019/07/30 Python
Python中logger日志模块详解
2020/08/04 Python
HTML5 在canvas中绘制矩形附效果图
2014/06/23 HTML / CSS
HTML5 audio标签使用js进行播放控制实例
2015/04/24 HTML / CSS
全球知名提供各类营养保健品的零售商:Vitamin Shoppe
2016/10/09 全球购物
Marmot土拨鼠官网:美国专业户外运动品牌
2018/01/11 全球购物
美国在线家具网站:GDFStudio
2021/03/13 全球购物
2013年高中生自我评价
2013/10/23 职场文书
门卫岗位职责
2013/11/15 职场文书
研发工程师的岗位职责
2013/11/18 职场文书
优秀大学生的自我评价
2014/01/16 职场文书
英文求职信写作小建议
2014/02/16 职场文书
电台实习生求职信
2014/02/25 职场文书
乡镇安全生产月活动总结
2015/05/08 职场文书