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如何为被装饰的函数保留元数据
Mar 21 Python
Python多进程池 multiprocessing Pool用法示例
Sep 07 Python
浅谈python在提示符下使用open打开文件失败的原因及解决方法
Nov 30 Python
利用Python+阿里云实现DDNS动态域名解析的方法
Apr 01 Python
对django 模型 unique together的示例讲解
Aug 06 Python
Python的条件锁与事件共享详解
Sep 12 Python
从pandas一个单元格的字符串中提取字符串方式
Dec 17 Python
详谈tensorflow gfile文件的用法
Feb 05 Python
python GUI库图形界面开发之PyQt5信号与槽机制、自定义信号基础介绍
Feb 25 Python
Python动态导入模块:__import__、importlib、动态导入的使用场景实例分析
Mar 30 Python
python和c语言哪个更适合初学者
Jun 22 Python
python实现将中文日期转换为数字日期
Jul 14 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使用正则表达式获取微博中的话题和对象名
2015/07/18 PHP
PHP-FPM实现性能优化
2016/03/31 PHP
PHP文件上传小程序 适合初学者学习!
2019/05/23 PHP
使用Grunt.js管理你项目的应用说明
2013/04/24 Javascript
jquery实现简单的拖拽效果实例兼容所有主流浏览器(优化篇)
2013/06/28 Javascript
解析Jquery的LigerUI如何实现文件上传
2013/07/09 Javascript
jquery实现倒计时代码分享
2014/06/13 Javascript
node.js中的fs.fchmod方法使用说明
2014/12/16 Javascript
《JavaScript DOM 编程艺术》读书笔记之JavaScript 简史
2015/01/09 Javascript
JavaScript通过prototype给对象定义属性用法实例
2015/03/23 Javascript
基于jQuery+Cookie实现的防止刷新的在线考试倒计时
2015/06/19 Javascript
在 Angular2 中实现自定义校验指令(确认密码)的方法
2017/01/23 Javascript
jQuery实现Select下拉列表进行状态选择功能
2017/03/30 jQuery
详解VueRouter进阶之导航钩子和路由元信息
2017/09/13 Javascript
使用原生js封装的ajax实例(兼容jsonp)
2017/10/12 Javascript
javascript中关于类型判断的一些疑惑小结
2018/10/14 Javascript
vue中的ref和$refs的使用
2018/11/22 Javascript
JS数组及对象遍历方法代码汇总
2020/06/16 Javascript
python实现计算倒数的方法
2015/07/11 Python
将Python代码打包为jar软件的简单方法
2015/08/04 Python
Python入门之三角函数sin()函数实例详解
2017/11/08 Python
django 按时间范围查询数据库实例代码
2018/02/11 Python
Python实现爬虫从网络上下载文档的实例代码
2018/06/13 Python
Python 实现某个功能每隔一段时间被执行一次的功能方法
2018/10/14 Python
python统计中文字符数量的两种方法
2019/01/31 Python
Python多重继承之菱形继承的实例详解
2020/02/12 Python
python3.x中安装web.py步骤方法
2020/06/23 Python
浅析Python requests 模块
2020/10/09 Python
一款基于css3麻将筛子3D翻转特效的实例教程
2014/12/31 HTML / CSS
HTML5 播放 RTSP 视频的实例代码
2019/07/29 HTML / CSS
集世界奢侈品和设计师品牌的意大利精品买手店:Tessabit
2019/08/17 全球购物
应付会计岗位职责
2013/12/12 职场文书
《鱼游到了纸上》教学反思
2014/02/20 职场文书
贷款承诺书
2015/01/20 职场文书
贷款收入证明格式
2015/06/24 职场文书
python tkinter模块的简单使用
2021/04/07 Python