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定时器使用示例分享
Feb 16 Python
python动态加载变量示例分享
Feb 17 Python
Python对两个有序列表进行合并和排序的例子
Jun 13 Python
python中self原理实例分析
Apr 30 Python
python魔法方法-属性访问控制详解
Jul 25 Python
Python Socket使用实例
Dec 18 Python
对python csv模块配置分隔符和引用符详解
Dec 12 Python
Python 函数返回值的示例代码
Mar 11 Python
python 实现识别图片上的数字
Jul 30 Python
Python实现对adb命令封装
Mar 06 Python
Xadmin+rules实现多选行权限方式(级联效果)
Apr 07 Python
在python下实现word2vec词向量训练与加载实例
Jun 09 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设计模式 php实现观察者模式(Observer)
2015/12/09 PHP
解决在laravel中leftjoin带条件查询没有返回右表为NULL的问题
2019/10/15 PHP
JavaScript 学习笔记(十一)
2010/01/19 Javascript
对字符串进行HTML编码和解码的JavaScript函数
2010/02/01 Javascript
如何将一个String和多个String值进行比较思路分析
2013/04/22 Javascript
js动态添加删除,后台取数据(示例代码)
2013/11/25 Javascript
js判断为空Null与字符串为空简写方法
2014/02/24 Javascript
实例分析js和C#中使用正则表达式匹配a标签
2014/11/26 Javascript
JS的数组迭代方法
2015/02/05 Javascript
JavaScript6 let 新语法优势介绍
2016/07/15 Javascript
利用js定义一个导航条菜单
2017/03/14 Javascript
js实现canvas保存图片为png格式并下载到本地的方法
2017/08/31 Javascript
浅谈Angular4实现热加载开发旅程
2017/09/08 Javascript
vue源码入口文件分析(推荐)
2018/01/30 Javascript
利用js实现前后台传送Json的示例代码
2018/03/29 Javascript
Vuex的actions属性的具体使用
2019/04/14 Javascript
Vue实现导航栏点击当前标签变色功能
2020/08/19 Javascript
vue项目中常见问题及解决方案(推荐)
2019/10/21 Javascript
jQuery实现聊天对话框
2020/02/08 jQuery
vue编写简单的购物车功能
2021/01/08 Vue.js
[40:31]Secret vs Alliacne 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/17 DOTA
python base64 decode incorrect padding错误解决方法
2015/01/08 Python
python对指定目录下文件进行批量重命名的方法
2015/04/18 Python
在Python中操作时间之tzset()方法的使用教程
2015/05/22 Python
pytorch: Parameter 的数据结构实例
2019/12/31 Python
python实现发送QQ邮件(可加附件)
2020/12/23 Python
Flesh Beauty官网:露华浓集团旗下彩妆品牌
2021/02/15 全球购物
2014年依法行政工作总结
2014/11/19 职场文书
2014年健康教育工作总结
2014/11/20 职场文书
2014年度工作总结报告
2014/12/15 职场文书
大学生入党自荐书
2015/03/05 职场文书
2016年圣诞节寄语(一句话)
2015/12/07 职场文书
python 利用 PIL 将数组值转成图片的实现
2021/04/12 Python
用Python创建简易网站图文教程
2021/06/11 Python
sql注入教程之类型以及提交注入
2021/08/02 MySQL
vue使用element-ui按需引入
2022/05/20 Vue.js