《算法导论》8.3 基数排序/8.4桶排序

注:因为时间有限,我会把算法的原理讲清楚,但一些算法的时间分析部分会略过,不过我会给出结论。

8.3 基数排序

一、引入

(1)基数排序是一种用在卡片排序机上的算法。比如说一张卡片分为80列,在每一列上可以选择12个位置,并可以在其中任一位置上穿孔,接着根据穿孔的位置来将其放入12个容器中,最后操作员Kauai逐一收集卡片,比如在第一个位置穿孔的卡片放置在最上面,第二个位置穿孔的,卡片放在第二个。

二、更加容易理解的例子

1、如果上面那个打孔机您无法理解,那么我们拿一堆十进制数进行排序。
下图为7个三位数。
在这里插入图片描述
图1 该图为n(7)张卡片组成,有d(3)列数,和正常我们的思维不同,我们是从最右边一列(个位)开始排序,然后再是十位,最后是百位。
2、比如日期排序,我们一般是从年月日这样依次排,但是在基数排序中,我们采用日月年的形式来排序。

三、伪代码

下面伪代码中,我们假设n个d位的元素放置在数组A中,第一位是最低位,第d位是最高位。

RADIX-SORT(A,d)
1 for i = 1 to d 
2 	use a stable sort to sort array A on digit i//根据第i位使用一个稳定排序对数组A的元素排序

四、一些引理

1、给定n个d位数,其中每一个数位有k个可能的取值。如果RADIX-SORT使用的稳定排序的方法耗时θ(n+k),那么它就可以在θ(d(n+k))时间内将这些数排好序。

证明:对算法时间的分析其实是依赖于所使用的稳定的排序算法。当k的值不大的时候,可以使用计数排序(见上一篇文章),因此对n个d位数来说,每一轮耗时θ(n+k),一共d轮,因此总时间为θ(d(n+k))。

2、给定n个b位数和任何正整数r<=b,如果RADIX-SORT使用的稳定排序算法对数据取值区间是0到k的输入进行排序耗时θ(n+k),那么它可以在θ((b+r)(n+2r))时间内将这些数排好序。

证明:略

8.4 桶排序

一、基本知识

1、桶排序(bucket sort)和计数排序一样,通过假设输入数据是服从均匀分布的,平均情况下它代价是O(n)。
2、大致实现方式:桶排序的输入是随机过程产生的,其输入均匀、独立分布在[0,1)区间上;桶排序将[0,1)区间划分成n个相同大小的子区间,或称为;为了得到输出结果,我们先对每个桶中的数进行排序,然后遍历每一个桶将各个桶的元素列出来即可。

二、案例讲解

在这里插入图片描述
图2 在n=10时,BUCKET-SORT的操作过程

① 前提引入:

(1)我们假设输入是一个包含n个元素的数组A,且每个元素A[i]满足0<=A[i]<1。
(2)算法还需要一个临时数组B[0…n-1]来存放链表。

② 解释图2:

(a)输入数组A[1…10]
(b)B[0…9]中已排序链表(桶)的情况,第i个桶中放置的是半开区间[i/10,(i+1)/10]中的值(即1桶中放的是0.10-0.19的值,2桶放的是0.20-0.29的值),排好序的输出是由链表B[0],B[1]…B[9]依次连接而成。

三、伪代码

BUCKET-SORT(A)
1 n = A.length
2 let B[0...n-1] be a new array //创建一个新的数组B
3 for i = 0 to n-1			    //遍历,使B[i]成为一个空数组
4 	make B[i] an empty list
5 for i = 1 to n				//遍历,将A[i]加入到B[⌊nA[i]⌋]中,因为这中方法可以将各个桶分开(对比上边的图)
6 	insert A[i] into list B[⌊nA[i]⌋]
7 for i = 0 to n-1				//将B[i]排序,即进行桶内部的排序
8 	sort list B[i] with insertion sort
9 concatenate the lists B[0],B[1],...,B[n-1] together in order //按照顺序将各个数值连接起来(以链表形式)

四、运行时间(证明略)

桶排序的期望运行时间为
在这里插入图片描述

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

KeepCoding♪Toby♪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值