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多进程通信Queue、Pipe、Value、Array实例
Nov 21 Python
django基础之数据库操作方法(详解)
May 24 Python
vscode 远程调试python的方法
Dec 01 Python
在pycharm中python切换解释器失败的解决方法
Oct 29 Python
python实现贪吃蛇游戏
Mar 21 Python
对python中assert、isinstance的用法详解
Nov 27 Python
详解python opencv、scikit-image和PIL图像处理库比较
Dec 26 Python
Python Numpy 控制台完全输出ndarray的实现
Feb 19 Python
Python *args和**kwargs用法实例解析
Mar 02 Python
python dir函数快速掌握用法技巧
Dec 09 Python
解决import tensorflow导致jupyter内核死亡的问题
Feb 06 Python
python基础详解之if循环语句
Apr 24 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
一个简单实现多条件查询的例子
2006/10/09 PHP
PHP中__get()和__set()的用法实例详解
2013/06/04 PHP
PHP正则验证Email的方法
2015/06/15 PHP
基于PHPexecl类生成复杂的报表表头示例
2016/10/14 PHP
thinkPHP框架实现多表查询的方法
2018/06/14 PHP
laravel5.2表单验证,并显示错误信息的实例
2019/09/29 PHP
不错的一个日期输入 动态
2006/11/06 Javascript
JavaScript 学习笔记(六)
2009/12/31 Javascript
ASP中Sub和Function的区别说明
2020/08/30 Javascript
圣诞节Merry Christmas给博客添加浪漫的下雪效果基于jquery实现
2012/12/27 Javascript
原生JS实现-星级评分系统的简单实例
2016/08/21 Javascript
AngularJS实现根据变量改变动态加载模板的方法
2016/11/04 Javascript
解决浏览器会自动填充密码的问题
2017/04/28 Javascript
EasyUI Datebox 日期验证之开始日期小于结束时间
2017/05/19 Javascript
ES6中字符串string常用的新增方法小结
2017/11/07 Javascript
vue 实现 ios 原生picker 效果及实现思路解析
2017/12/06 Javascript
nodejs更新package.json中的dependencies依赖到最新版本的方法
2018/10/10 NodeJs
Windows下Node爬虫神器Puppeteer安装记
2019/01/09 Javascript
vue数据初始化initState的实例详解
2019/04/11 Javascript
[01:15]PWL S2开团时刻第二期——他们杀 我就白给
2020/11/25 DOTA
详细介绍Python语言中的按位运算符
2013/11/26 Python
Python 编码处理-str与Unicode的区别
2016/09/06 Python
使用Python对SQLite数据库操作
2017/04/06 Python
对numpy和pandas中数组的合并和拆分详解
2018/04/11 Python
python 应用之Pycharm 新建模板默认添加编码格式-作者-时间等信息【推荐】
2019/06/17 Python
通过实例解析Python调用json模块
2019/12/11 Python
Selenium启动Chrome时配置选项详解
2020/03/18 Python
Python使用Pyqt5实现简易浏览器(最新版本测试过)
2020/04/27 Python
tensorflow 2.0模式下训练的模型转成 tf1.x 版本的pb模型实例
2020/06/22 Python
python中pyplot基础图标函数整理
2020/11/10 Python
BONIA波尼亚新加坡官网:皮革手袋,鞋类和配件
2016/08/25 全球购物
Lovedrobe官网:英国领先的大码服装品牌
2019/09/19 全球购物
课外访万家心得体会
2014/09/03 职场文书
2014年军人思想汇报范文
2014/10/12 职场文书
学生退学证明
2015/06/23 职场文书
详解MySQL集群搭建
2021/05/26 MySQL