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微信库itchat实现微信自动回复功能
May 18 Python
Python3.X 线程中信号量的使用方法示例
Jul 24 Python
python 使用sys.stdin和fileinput读入标准输入的方法
Oct 17 Python
python 拼接文件路径的方法
Oct 23 Python
Python实现定制自动化业务流量报表周报功能【XlsxWriter模块】
Mar 11 Python
详解python中@的用法
Mar 27 Python
pyqt5之将textBrowser的内容写入txt文档的方法
Jun 21 Python
django之静态文件 django 2.0 在网页中显示图片的例子
Jul 28 Python
用Python批量把文件复制到另一个文件夹的实现方法
Aug 16 Python
python中68个内置函数的总结与介绍
Feb 24 Python
对Python中 \r, \n, \r\n的彻底理解
Mar 06 Python
bat批处理之字符串操作的实现
Mar 16 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使用curl和正则表达式抓取网页数据示例
2014/04/13 PHP
php生成固定长度纯数字编码的方法
2015/07/09 PHP
jQuery的一些注意
2006/12/06 Javascript
Display SQL Server Version Information
2007/06/21 Javascript
模仿JQuery sortable效果 代码有错但值得看看
2009/11/05 Javascript
多种方法实现360浏览器下禁止自动填写用户名密码
2014/06/16 Javascript
Javascript基础知识(一)核心基础语法与事件模型
2014/09/29 Javascript
PHP守护进程实例
2015/03/06 Javascript
JS实现网页每隔3秒弹出一次对话框的方法
2015/11/09 Javascript
值得分享的JavaScript实现图片轮播组件
2016/11/21 Javascript
Javascript之面向对象--接口
2016/12/02 Javascript
jQuery简单实现遍历单选框的方法
2017/03/06 Javascript
jQuery实现鼠标滑过预览图片大图效果的方法
2017/04/26 jQuery
vue-cli实现多页面多路由的示例代码
2018/01/30 Javascript
JS实现DOM删除节点操作示例
2018/04/04 Javascript
vue+ElementUI 关闭对话框清空验证,清除form表单的操作
2020/08/06 Javascript
JS+Canvas实现五子棋游戏
2020/08/26 Javascript
[02:48]DOTA2英雄基础教程 拉席克
2013/12/12 DOTA
深度剖析使用python抓取网页正文的源码
2014/06/11 Python
python使用点操作符访问字典(dict)数据的方法
2015/03/16 Python
Python3.6简单操作Mysql数据库
2017/09/12 Python
pyqt5与matplotlib的完美结合实例
2019/06/21 Python
python实现屏保程序(适用于背单词)
2019/07/30 Python
Python3 使用map()批量的转换数据类型,如str转float的实现
2019/11/29 Python
详解用Python进行时间序列预测的7种方法
2020/03/13 Python
基于django micro搭建网站实现加水印功能
2020/05/22 Python
canvas像素点操作之视频绿幕抠图
2018/09/11 HTML / CSS
英国快时尚女装购物网站:PrettyLittleThing
2018/08/15 全球购物
Nanushka官网:匈牙利服装品牌
2019/08/14 全球购物
职业生涯规划书前言
2014/04/15 职场文书
班风口号
2014/06/18 职场文书
户外活动总结
2015/02/04 职场文书
统计工作个人总结
2015/03/03 职场文书
留学文书中的个人陈述,应该注意哪些问题?
2019/08/23 职场文书
一文读懂navicat for mysql基础知识
2021/05/31 MySQL
Vue组件更新数据v-model不生效的解决
2022/04/02 Vue.js