桶排序(LeetCode220)

桶排序

1 介绍

桶排序(箱排序)是一种较优的排序算法,其工作原理是将数组分到有限数量的桶中。每个桶再分别排序,最后将桶按顺序输出即可得到有序的序列。桶排序比较适合数据发布均匀的数据集。

2 原理

基本原理再介绍部分以及阐述过,简单总结一下桶排序的特点。一个桶中可以存放不止一个元素,并且这些元素都属于某个范围内。例如1-5范围内的数字放到编号为1的桶中,6-10的数字放到编号为2的桶中,依次类推。桶中的数据可以通过链表连接起来。正是桶排序的这个特点,使得其更适合分布均匀的数据,否则数据间跨度较大,会导致许多空桶,造成空间浪费。

下面通过一个简单的排序例子来说明整个排序的逻辑过程。

有一个待排序序列:63, 28, 47, 67, 51, 13,98,我们有这样一个规定,桶0中放的数据范围是[13,51),桶1放的数据范围是[51,85), 桶3放是数据范围是[85,122);

排序步骤如下:

初始状态

取出第一个数放到对应的桶中

继续取数

待排序序列已空,按桶顺序输出序列即可得到排序序列。

13,28, 47, 51, 63, 67, 98

上述过程是基本的桶排序过程,下面通过leetcode上一道算法题来具体阐述关于桶排序的应用。

3 应用

LeetCode220

给你一个整数数组 nums 和两个整数 k 和 t 。请你判断是否存在 两个不同下标 i 和 j,使得 abs(nums[i] - nums[j]) <= t ,同时又满足 abs(i - j) <= k 。

如果存在则返回 true,不存在返回 false。

示例一:

输入:nums = [1,2,3,1], k = 3, t = 0
输出:true

示例二:

输入:nums = [1,0,1,1], k = 1, t = 2
输出:true

示例三:

输入:nums = [1,5,9,1,5,9], k = 2, t = 3
输出:false

3.1 思路

首先理清题目表达的意思,题目的意思是在数组中找到下标间隔不超过k的两个元素,使得这两个元素差值的绝对值小于等于t.

理解题目意思后我们需要考虑怎么实现,首先是第一个个条件,两个元素的下边间隔不超过K,这个很容易想到滑动窗口,在大小为k的滑动窗口内,任意两个元素的下标间隔都不会大于k。

满足第一个条件后,我们来思考怎么满足第二个条件。这就是本篇文章的主题,桶排序。我们可以使用若干个桶,每个桶表示的范围大小的t。例如当 t = 5时,我们使得桶0中的元素范围为[0,5],桶1的元素范围为[6,11],若有这样的一个数组[1,5,9];

按照桶排序的初始步骤,将第一个元素装入桶0, 接着第二个元素也装入桶0,在同一个桶中的元素,表示他们的差绝对不会超过桶表示的范围。也就是说例子中的第一个元素与第二个元素装入同一个桶中,这两个元素满足了abs(nums[i] - nums[j]) <= t 。

除了在同一个桶中的元素满足题目条件外,在左右相邻的桶中的元素也可能满足条件。,设想数组中有元素5和6; 5和6显然不再一个桶中,但是他们的差值也小于t。故除了在同一个同中的元素可能满足条件外,相邻桶也可能满足条件。

理清了大概的思路后,我们需要来考虑具体实现的细节问题。我们需要一个映射关系来讲0-5的元素,映射到桶0中,一般来讲就是我们需要考虑怎么将数组中的元素映射到桶中,使得在某个范围内的元素能够被准确的存放到一个桶中。

还是通过上面的例子来说明,当t = 5时,桶0中存放的元素范围0-5,我们需要一定的运算使得,0-5中的所有元素计算后都得到0。这就是小学的加减乘除问题。桶范围大小是6,0-5中的所有元素除以6都得0。同理,若是6-11中的所有元素除以6,得到结果都是1.这就保证了不同范

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值