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程序语言快速上手教程
Jul 18 Python
Python多线程爬虫简单示例
Mar 04 Python
Python加密方法小结【md5,base64,sha1】
Jul 13 Python
django2 快速安装指南分享
Jan 05 Python
python DataFrame获取行数、列数、索引及第几行第几列的值方法
Apr 08 Python
详解PyTorch批训练及优化器比较
Apr 28 Python
python事件驱动event实现详解
Nov 21 Python
Python完成毫秒级抢淘宝大单功能
Jun 06 Python
Python并发concurrent.futures和asyncio实例
May 04 Python
python可迭代对象去重实例
May 15 Python
Numpy中ndim、shape、dtype、astype的用法详解
Jun 14 Python
Python 绘制多因子柱状图
May 11 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
雄兵连:第三季确定会出,不过时间未定,鹤熙是第三季的主角!
2020/03/13 国漫
PHP 引用是个坏习惯
2010/03/12 PHP
PHP中防止SQL注入攻击和XSS攻击的两个简单方法
2010/04/15 PHP
php中禁止单个IP与ip段访问的代码小结
2012/07/04 PHP
PHP中is_file()函数使用指南
2015/05/08 PHP
CodeIgniter与PHP5.6的兼容问题
2015/07/16 PHP
php文件上传类完整实例
2016/05/14 PHP
php上传excel表格并获取数据
2017/04/27 PHP
php处理抢购类功能的高并发请求
2018/02/08 PHP
jQuery 使用手册(四)
2009/09/23 Javascript
XHTML下,JS浮动代码失效的问题
2009/11/12 Javascript
DOM2非标准但却支持很好的几个属性小结
2012/01/21 Javascript
提交表单时执行func方法实现代码
2013/03/17 Javascript
jquery如何判断某元素是否具备指定的样式
2013/11/05 Javascript
JavaScript原型链示例分享
2014/01/26 Javascript
jquery.validate.js插件使用经验记录
2014/07/02 Javascript
javascript实现带下拉子菜单的导航菜单效果
2015/05/14 Javascript
JavaScript数组对象赋值用法实例
2015/08/04 Javascript
JS简单验证上传文件类型的方法
2017/04/17 Javascript
JS实现的字符串数组去重功能小结
2019/06/17 Javascript
vue.js+elementUI实现点击左右箭头切换头像功能(类似轮播图效果)
2019/09/05 Javascript
JavaScript(js)处理的HTML事件、键盘事件、鼠标事件简单示例
2019/11/19 Javascript
nuxt配置通过指定IP和端口访问的实现
2020/01/08 Javascript
javascript实现电商放大镜效果
2020/11/23 Javascript
pycharm运行出现ImportError:No module named的解决方法
2018/10/13 Python
python采集百度搜索结果带有特定URL的链接代码实例
2019/08/30 Python
css3实现波纹特效、H5实现动态波浪效果
2018/01/31 HTML / CSS
携程英文网站:Trip.com
2017/02/07 全球购物
台湾旅游网站:雄狮旅游网
2017/08/16 全球购物
大学生学习计划书
2014/09/15 职场文书
华清池导游词
2015/02/02 职场文书
大学生个人简历自我评价
2015/03/11 职场文书
学习焦裕禄先进事迹心得体会
2016/01/23 职场文书
python 自动化偷懒的四个实用操作
2021/04/11 Python
python基础入门之字典和集合
2021/06/13 Python
一次线上mongo慢查询问题排查处理记录
2022/03/18 MongoDB