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抓取京东商城手机列表url实例代码
Dec 18 Python
python实现下载指定网址所有图片的方法
Aug 08 Python
Python找出微信上删除你好友的人脚本写法
Nov 01 Python
django框架CSRF防护原理与用法分析
Jul 22 Python
Python综合应用名片管理系统案例详解
Jan 03 Python
python中数据库like模糊查询方式
Mar 02 Python
Tensorflow卷积实现原理+手写python代码实现卷积教程
May 22 Python
Pygame框架实现飞机大战
Aug 07 Python
Python中的特殊方法以及应用详解
Sep 20 Python
Django实现简单的分页功能
Feb 22 Python
使用python实现学生信息管理系统
Feb 25 Python
Django cookie和session的应用场景及如何使用
Apr 29 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
一个MYSQL操作类
2006/11/16 PHP
ThinkPHP之foreach标签使用概述
2014/06/30 PHP
PHP利用Socket获取网站的SSL证书与公钥
2017/06/18 PHP
Yii2框架视图(View)操作及Layout的使用方法分析
2019/05/27 PHP
php使用gearman进行任务分发操作实例详解
2020/02/26 PHP
Javascript this指针
2009/07/30 Javascript
javascript 处理HTML元素必须避免使用的一种方法
2009/07/30 Javascript
qTip2 精致的基于jQuery提示信息插件
2012/02/17 Javascript
replace()方法查找字符使用示例
2013/10/28 Javascript
jquery实现无限分级横向导航菜单的方法
2015/03/12 Javascript
gulp-htmlmin压缩html的gulp插件实例代码
2016/06/06 Javascript
ES6新特性六:promise对象实例详解
2017/04/21 Javascript
微信小程序显示倒计时功能示例【测试可用】
2018/12/03 Javascript
Python实现Linux下守护进程的编写方法
2014/08/22 Python
Python 将Matrix、Dict保存到文件的方法
2018/10/30 Python
python实时获取外部程序输出结果的方法
2019/01/12 Python
Python实现读取txt文件中的数据并绘制出图形操作示例
2019/02/26 Python
python使用requests.session模拟登录
2019/08/09 Python
Python3中configparser模块读写ini文件并解析配置的用法详解
2020/02/18 Python
python爬虫开发之PyQuery模块详细使用方法与实例全解
2020/03/09 Python
更新升级python和pip版本后不生效的问题解决
2020/04/17 Python
Django扫码抽奖平台的配置过程详解
2021/01/14 Python
洛杉矶健身中心女性专用运动服饰品牌:Marika
2018/05/09 全球购物
ColourPop美国官网:卡拉泡泡,洛杉矶彩妆品牌
2019/04/28 全球购物
美国户外服装和装备购物网站:Outland USA
2020/03/22 全球购物
建筑实习自我鉴定
2013/10/18 职场文书
《四季》教学反思
2014/04/08 职场文书
网站出售协议书范文
2014/10/10 职场文书
安全生产工作汇报材料
2014/10/28 职场文书
2014年优质护理服务工作总结
2014/11/14 职场文书
离婚协议书样本
2015/01/26 职场文书
街道社区活动报告
2015/02/05 职场文书
总账会计岗位职责
2015/04/02 职场文书
SQL Server中常用截取字符串函数介绍
2022/03/16 SQL Server
Vue OpenLayer测距功能的实现
2022/04/20 Vue.js
大型强子对撞机再次重启探索“第五种自然力”
2022/04/29 数码科技