Python数据结构与算法之常见的分配排序法示例【桶排序与基数排序】

转载 2018年04月16日 21:26:08

Python数据结构与算法之常见的分配排序法示例【桶排序与基数排序】

本文实例讲述了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排序,依次类推。

三种线性排序算法:计数排序、桶排序与基数排序

计数排序、桶排序与基数排序
  • timcompp
  • timcompp
  • 2017-03-05 20:02:46
  • 131

桶排序和基数排序 Java

桶式排序 概念 有限个数字m,每个数字的大小都在1与n之间,则我们可以假设有n个桶,遍历m个数字,将其存入对应的桶中(如数字的值为3,就存入3号桶,桶的值对应存入数字的个数) 例子 有数字3,3,5,...
  • u011863767
  • u011863767
  • 2016-12-28 19:36:43
  • 769

数据结构基础(15) --基数排序

基数排序是一种借助“多关键字排序”的思想来实现“单关键字排序”的内部排序算法。实现多关键字排序通常有两种作法:   最低位优先法(LSD)    先对K[0]{基数的最低位}进行排序,并按 K(0) ...
  • hanqing280441589
  • hanqing280441589
  • 2015-01-11 10:57:22
  • 2764

【算法】桶排序

桶排序 桶排序(Bucket Sort)假设输入数据服从均匀分布,然后将输入数据均匀地分配到有限数量的桶中,然后对每个桶再分别排序,对每个桶再使用其他的排序算法,最后将每个桶中的数据有序的组合起来。前...
  • cauchyweierstrass
  • cauchyweierstrass
  • 2015-11-19 13:18:59
  • 4780

基数排序与桶排序C实现

一. 算法描述 基数排序(以整形为例),将整形10进制按每位拆分,然后从低位到高位依次比较各个位。主要分为两个过程: (1)分配,先从个位开始,根据位值(0-9)分别放到0~9号桶中(比如53,个位为...
  • xwchao2014
  • xwchao2014
  • 2015-04-01 11:05:05
  • 1503

桶排序,冒泡排序,快速排序算法Python实现

桶排序案例:学生分数为0~10,要按照从小到大排序: 1. 首先我们需要申请一个大小为10的数组(python为列表),然后遍历学生成绩,每遍历一个成绩就在序号=成绩的位置+1. 2. 生成完列表...
  • horseinch
  • horseinch
  • 2016-07-20 23:11:10
  • 1703

【数据结构与算法】——基数排序

基数排序 基本思想:它是一种非比较排序。它是根据位的高低进行排序的,也就是先按个位排序,然后依据十位排序……以此类推。 时间复杂度: 分配需要O(n),收集为O(r),其中r为分配后链表的个数,以r=...
  • u010164936
  • u010164936
  • 2015-10-31 18:49:16
  • 760

python进行桶排序与基数排序总结

本文首先举例阐述了两种排序方法的操作步骤,然后列出了用python进行的实现过程,最后对桶式排序方法的优劣进行了简单总结。 一、桶排序:排序一个数组[5,3,6,1,2,7,5,10]值都在1-10之...
  • IqqIqqIqqIqq
  • IqqIqqIqqIqq
  • 2017-02-02 20:29:54
  • 1292

数据结构--排序算法(归并排序&&基数排序&&桶排序)

在前面我们说了快速排序等排序方法,如有同学想看则请查阅往期博: 插入排序,选择排序:http://blog.csdn.net/sayhello_world/article/details/619270...
  • sayhello_world
  • sayhello_world
  • 2017-03-24 16:52:03
  • 545

计数排序、桶排序python实现

计数排序在输入n个0到k之间的整数时,时间复杂度最好情况下为O(n+k),最坏情况下为O(n+k),平均情况为O(n+k),空间复杂度为O(n+k),计数排序是稳定的排序。 桶排序在输入N个数据有M个...
  • u011608357
  • u011608357
  • 2014-07-12 14:28:02
  • 1583
收藏助手
不良信息举报
您举报文章:Python数据结构与算法之常见的分配排序法示例【桶排序与基数排序】
举报原因:
原因补充:

(最多只允许输入30个字)