【数据结构与算法】(16):桶除了能装饭还能排序?

🤡博客主页:Code_文晓

🥰本文专栏:数据结构与算法

😻欢迎关注:感谢大家的点赞评论+关注,祝您学有所成!


✨✨💜💛想要学习更多数据结构与算法点击专栏链接查看💛💜✨✨ 


        一般情形的桶排序比较少用,做个简单了解即可,为后面基于桶排序思想的计数排序和基数排序做个铺垫 《计数排序和基数排序详解》。

桶排序

        桶排序将待排序序列划分成若干个区间,每个区间可形象地看作一个桶,如果桶中的记录多于一个则使用较快的排序方法进行排序,把每个桶中的记录收集起来,最终得到有序序列。

        桶排序需要创建若干个桶来协助排序 每一个桶(bucket)代表一个区间范围,里面可以承载一个或多个元素。桶排序的第1步,就是创建这些桶,并确定每一个桶的区间范围具体需要建立多少个桶,如何确定桶的区间范围,有很多种不同的方式,这个比较随意。

        例如,这里以 {12,18,0,91,40,66,78,89,6,27,39,22,31,55,52,97,62,45,11,80} 这组待排序的数据进行说明。

        上面这组数据的范围在0~100之间,所以可以把这个区间划分成4个(该数字比较随意)大小相同的子区间(4个桶):0~25、26~50、51~75、76~100。然后把这些待排序的数据根据自身大小放入对应的桶中。如下图所示。

        同一个桶中的数据可以采用数组、链表等数据结构存储。针对每一个桶中的数据进行单独的从小到大排序,再按桶的次序(从左到右)把各个桶中的数据输出出来,如下图所示。

不过,桶排序会涉及一些问题。

  • 待排序数据如果分布不均匀,就会导致有的桶中数据很多,有的桶中数据很少,甚至有的桶中没有数据的情形。

  • 每个桶中数据如何存储(比如是使用数组还是链表)以及桶中数据如何排序的问题。

如果用数组存储桶中数据,那么数组设置多大合适呢?如果采用可以扩容的数组,存满数据时将申请更大的内存空间,将整个数组搬到该内存空间,那么无疑会影响算法效率,而如果采用固定大小数组,那么数组就得设置为能够容纳所有待排序数据的大小,就会很浪费内存。如果采用链表,那么对桶中数据进行排序就会很不方便,时间复杂度会很高。

  • 每个桶中的数据可以采用归并排序、快速排序等手段进行排序。

总之,桶排序是一种用空间换取时间的排序算法。这个算法是有一些使用限制的,要求待排序的数据均匀分布,桶的个数要设置合理以避免空桶的产生。

桶排序算法的实现代码我在这里就不提供了,并不复杂,实现方式也比较灵活。有兴趣的话你可以自行编写。  

桶排序算法复杂度分析

我们先来梳理一下桶排序的时间复杂度。

  • 遍历n个元素的数组(n次循环),求数据中最小值和最大值来决定桶的数量和每个桶中保存数据的范围。这个时间复杂度为O(n)。

  • 遍历n个元素并装到桶中(n次循环),所以这一步的时间复杂度为O(n)。

  • 假设共有k个桶(大概每个桶中平均有\frac{n}{k}个元素),k次循环对每个桶中的数据排序。如果采用快速排序方式(算法的时间复杂度为O(nlog^{n}_{2}),这里的 n 应该用 \frac{n}{k} 来代替,因为 \frac{n}{k} 才是桶中元素个数,所以快速排序算法时间复杂度为O(\frac{n}{k}log^{\frac{n}{k}}_{2}),所以所有桶中数据排序的总时间复杂度为O(k\frac{n}{k}log^{\frac{n}{k}}_{2}),即O(nlog^{\frac{n}{k}}_{2})。

  • 结果输出的时间复杂度也是O(n)。

  • 所以整个算法时间复杂度是O(n+nlog^{\frac{n}{k}}_{2})。

  • 如果使用n个桶并且待排序值分布很均匀,此时可以避免桶内数据排序,此时的时间复杂度接近O(n),此时的排序就等于是计数排序了。

  • 如果数据全部放到一个桶去那就是最差的情况了,此时桶排序的时间复杂度就退化到O(nlog^{n}_{2})了。

其实,桶排序算法的时间复杂度说法不一,因为内部使用的数据结构不同,实现代码不一样等。另外因为有k个桶,也涉及对 k个桶初始化,所以有些资料上给的算法时间复杂度是O(n+k+nlog^{\frac{n}{k}}_{2})等。其实这些答案各有道理,并不建议你深究,因为本身时间复杂度也是一个估算值,既然是估算,就肯定不会非常精确。

桶排序的空间复杂度大概为O(n+k)。一般来说,如果算法的时间复杂度有所改善,那么算法的空间复杂度一般就会增加。

桶排序算法的稳定与否取决于对同一个桶中数据的排序所采用的排序算法是否稳定,比如采用快速排序,则桶排序算法是不稳定的,如果采用归并排序,则桶算法是稳定的。

        一般情形桶排序的并不常用,本篇文章学习结束后推荐学习桶排序的特殊情形,《计数排序和基数排序详解》✨❤️~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/753938.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

源神,启动!马斯克开源史上最大模型Grok,参数高达3140亿,可商用!

马斯克真不愧是源神,自开源X的推荐算法以及特斯拉智能驾驶算法后,又说到做到,开源旗下大模型Grok! 代码和模型权重已上线GitHub。官方信息显示,此次开源的Grok-1是一个3140亿参数的混合专家模型,远超OpenAI…

HTML选择文件的实时预览

HTML选择文件的实时预览 目录 HTML选择文件的实时预览HTML代码JS代码预览 HTML代码 <input type"file" id"adv_img_input" style"width: 1000px ;height:30px"> <img src"#"id"adv_img">JS代码 <script>…

配置OGG 如何批量修改源端及目标端序列值_满足客户变态需求学会这招你就赚了

欢迎您关注我的公众号【尚雷的驿站】 **************************************************************************** 公众号&#xff1a;尚雷的驿站 CSDN &#xff1a;https://blog.csdn.net/shlei5580 墨天轮&#xff1a;https://www.modb.pro/u/2436 PGFans&#xff1a;ht…

WanAndroid(鸿蒙版)开发的第三篇

前言 DevEco Studio版本&#xff1a;4.0.0.600 WanAndroid的API链接&#xff1a;玩Android 开放API-玩Android - wanandroid.com 其他篇文章参考&#xff1a; 1、WanAndroid(鸿蒙版)开发的第一篇 2、WanAndroid(鸿蒙版)开发的第二篇 3、WanAndroid(鸿蒙版)开发的第三篇 …

2024年3月GESP认证Scratch图形化编程四级真题及答案

GESP 图形化四级试卷 &#xff08;满分&#xff1a;100 分 考试时间&#xff1a;120 分钟&#xff09; 学校&#xff1a; 姓名&#xff1a; ​ 一、单选题&#xff08;共 10 题&#xff0c;每题 2 分&#xff0c;共 30 分&#xff09; 题号 1 2 3 4 5 6 7 8 9 10 11 1…

【开源】SpringBoot框架开发学生综合素质评价系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 学生功能2.2 教师功能2.3 教务处功能 三、系统展示四、核心代码4.1 查询我的学科竞赛4.2 保存单个问卷4.3 根据类型查询学生问卷4.4 填写语数外评价4.5 填写品德自评问卷分 五、免责说明 一、摘要 1.1 项目介绍 基于J…

数字化转型导师坚鹏:人工智能在金融机构数字化转型中的应用

人工智能在金融机构数字化转型中的应用 课程背景&#xff1a; 金融机构数字化转型离不开人工智能&#xff0c;在金融机构数字化转型中&#xff0c;人工智能起到至关重要的作用&#xff0c;很多机构存在以下问题&#xff1a; 不清楚人工智能产业对我们有什么影响&#xff1f;…

考研数学|概率应该怎么学?

考研概率论老师很多&#xff0c;但是我最推荐两个老师&#xff0c;李良和方浩 我认为李良概率论基础讲解相比于其他老师最大的优点就是&#xff0c;每一步都会耐心解释其中的逻辑。很少会像方浩老师那样过于跳跃或者频繁串联&#xff0c;这点对于零基础思维转换慢的人来说&…

Transformer self-attention源码及原理理解

自注意力计算公式&#xff1a; 在公式(1)中Q(query)是输入一个序列中的一个token&#xff0c;K(key)代表序列中所有token的特征。 可以得到当前token与序列中其他token的相关性。在论文原文中512&#xff0c;表示每个token用512维特征表示&#xff08;序列符号的embedding长度…

C语言中大小写字母如何转化

&#x1f31f; 前言 欢迎来到我的技术小宇宙&#xff01;&#x1f30c; 这里不仅是我记录技术点滴的后花园&#xff0c;也是我分享学习心得和项目经验的乐园。&#x1f4da; 无论你是技术小白还是资深大牛&#xff0c;这里总有一些内容能触动你的好奇心。&#x1f50d; &#x…

Linux TCP参数——tcp_adv_win_scale

文章目录 tcp_adv_win_scaleip-sysctl.txt解释buffering overhead内核缓存和应用缓存示例计算深入理解从2到1(tcp_adv_win_scale的值)总结 tcp_adv_win_scale adv-advise&#xff1b;win-window; 用于指示TCP中接收缓存比例的值。 static inline int tcp_win_from_space(int …

SpringSecurity(SpringBoot2.X版本实现)

资料来源于 SpringSecurity框架教程-Spring SecurityJWT实现项目级前端分离认证授权 侵权删 目录 介绍 快速开始 认证 认证流程 登录校验流程 SpringSecurity完整流程 认证流程详解 代码实现 准备工作 mysql mybatis-plus redis 统一返回类 核心代码 密码加密存…

Mesh网格obj文件构成解析

众所周知&#xff0c;Mesh网格是三维重建的常用手法&#xff0c;通过顶点-三角面的形式来完成对三维物体的表达。其中&#xff0c;最常见的Mesh网格文件格式就是obj格式。看起来复杂的三维形状其实在数值表示上是很简单的&#xff0c;大家跟我一起来做个小实验就好&#xff1a;…

echarts散点图自定义tooltip,鼠标放上去展示多行数据

先放效果图 如图&#xff0c;就是鼠标悬停在散点上&#xff08;这里的散点我替换成了图片&#xff0c;具体做法参考这篇文章&#xff1a;echarts散点图的散点用自定义图片替代-CSDN博客&#xff09;时&#xff0c;可以展示多行数据。之前查找资料的时候&#xff0c;很多用字符串…

练习unittest+Fixture实现

练习01 创建⼀个⽬录 case, 作⽤就是⽤来存放⽤例脚本,在这个⽬录中创建 5 个⽤例代码⽂件 , test_case1.py使⽤ TestLoader 去执⾏⽤例 将来的代码 ⽤例都是单独的⽬录中存放的 test_项⽬_模块_功能.py test_case1.py # 1. 导包 unittest import unittest # 2. 定义测试类, 只…

面试经典150题(114-118)

leetcode 150道题 计划花两个月时候刷完之未完成后转&#xff0c;今天完成了5道(114-118)150 gap 了一周&#xff0c;以后就不记录时间了。。 114.(70. 爬楼梯) 题目描述&#xff1a; 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不…

旅行社旅游线路预定管理系统asp.net

旅行社旅游线路预定管理系统 首页 国内游 境外游 旅游景点 新闻资讯 酒店信息―留言板 后台管理 后台管理导航菜单系统管理修改密码留言管理注册会员管理基础数据设置国别设置有份设地区设置 旅行社管理友情链接管理添加友情链接友情链接管理新闻资讯管理添加新闻资讯新闻资讯管…

LayerNormalization 和 RMSNormalization的计算方法和区别

目录 问题来源 Layer Normalization 与 RMSNormalization 的详细计算方法 Layer Normalization&#xff08;层归一化&#xff09; RMSNormalization&#xff08;均方根归一化&#xff09; Layer Normalization与RMSNormalization的异同 Layer Normalization RMSNormaliza…

24 OpenCV直方图反向投影

文章目录 参考反向投影作用calceackProject 反向投影mixchannels 通道图像分割示例 参考 直方图反向投影 反向投影 反向投影是反映直方图模型在目标图像中的分布情况简单点说就是用直方图模型去目标图像中寻找是否有相似的对象。通常用HSV色彩空间的HS两个通道直方图模型 作用…

基于时空上下文(STC)的运动目标跟踪算法,Matlab实现

博主简介&#xff1a; 专注、专一于Matlab图像处理学习、交流&#xff0c;matlab图像代码代做/项目合作可以联系&#xff08;QQ:3249726188&#xff09; 个人主页&#xff1a;Matlab_ImagePro-CSDN博客 原则&#xff1a;代码均由本人编写完成&#xff0c;非中介&#xff0c;提供…