【数据结构与算法】(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,一经查实,立即删除!

相关文章

面试题 整理

第1题:常见数据类型大小 这边以64位计算机系统,环境而言。 类型 存储大小 值范围 char 1 字节 -128 到 127 或 0 到 255 unsigned char 1 字节 0 到 255 signed char 1 字节 -128 到 127 int 4 字节 -32,768 到 32,767 或 -2,147,483,648…

Python写猜数游戏

猜数游戏大家都玩过吧 规则:想一个数,然后去猜 所需用的库 作用是用来取随机数的 import random 然后定义机会和正确答案变量 answer random.randint(1, 100) opportunity 6 接下来定义规则逻辑 while opportunity > 0:print(f"| 还…

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

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

C语言之判断浮点数

目录 一 简介 二 代码实现 A.方法一 B.方法二 二 时空复杂度 A.方法一 B.方法二 一 简介 在C语言中,判断浮点数的算法通常涉及到比较两个浮点数是否相等或比较它们的大小。由于浮点数运算存在精度误差问题,直接使用 或 ! 进行比较可能会导致不准…

如何搭建一个 tts 语言合成模型

搭建一个文本到语音(TTS)模型是一个涉及多个步骤的过程,包括数据准备、模型选择、训练、评估和部署。以下是一个简化的指南,介绍如何搭建一个基本的TTS模型: 1. 数据准备 数据收集:获取大量的文本和相应的…

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>…

OpenAI引领下一代AI技术,推出GPT-4 Turbo

OpenAI引领下一代AI技术&#xff1a;GPT-4 Turbo 摘要 OpenAI最近对其GPT-4和GPT-3.5语言模型进行了一系列改进&#xff0c;推出了GPT-4 Turbo&#xff0c;这是AI交互和计算语言学领域的一次重大突破。GPT-4 Turbo拥有更广泛的知识库和更大的上下文窗口&#xff0c;能够更准确…

配置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…

通信协议如何连接代码-自动窗帘系统

要将自动窗帘系统的代码与硬件通过通信协议连接起来&#xff0c;你需要确保硬件支持相应的通信接口和协议。以下是一个一般性的步骤概述&#xff0c;帮助你理解如何实现这一过程&#xff1a; (1)选择通信协议&#xff1a; 首先&#xff0c;确定你的硬件支持的通信协议。常见的通…

【开源】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 …

【字符串算法题】541. 反转字符串 II

题目链接 思考 把字符串以2k的步长分成count_reverse个子区间。考虑最后一个子区间的字符数量&#xff1a;1&#xff09;如果大于等于k&#xff0c;则它要和前面的子区间一样&#xff0c;要对区间内的前k个字符进行反转&#xff1b;2&#xff09;如果小于k&#xff0c;则它的…

SpringSecurity(SpringBoot2.X版本实现)

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

Mesh网格obj文件构成解析

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