c++ 桶排序(看这一篇就够了)
1. 概述
桶排序(Bucket Sort)又称箱排序,是一种比较常用的排序算法。其算法原理是将数组分到有限数量的桶里,再对每个桶分别排好序(可以是递归使用桶排序,也可以是使用其他排序算法将每个桶分别排好序),最后一次将每个桶中排好序的数输出。
2. 算法详解
桶排序的思想就是把待排序的数尽量均匀地放到各个桶中,再对各个桶进行局部的排序,最后再按序将各个桶中的数输出,即可得到排好序的数。
首先确定桶的个数。因为桶排序最好是将数据均匀地分散在各个桶中,那么桶的个数最好是应该根据数据的分散情况来确定。首先找出所有数据中的最大值mx和最小值mn;
根据mx和mn确定每个桶所装的数据的范围 size,有
size = (mx - mn) / n + 1,n为数据的个数,需要保证至少有一个桶,故而需要加个1;
求得了size即知道了每个桶所装数据的范围,还需要计算出所需的桶的个数cnt,有
cnt = (mx - mn) / size + 1,需要保证每个桶至少要能装1个数,故而需要加个1;
求得了size和cnt后,即可知第一个桶装的数据范围为 [mn, mn + size),第二个桶为 [mn + size, mn + 2 * size),…,以此类推
因此步骤2中需要再扫描一遍数组,将待排序的各个数放进对应的桶中。
对各个桶中的数据进行排序,可以使用其他的排序算法排序,例如快速排序;也可以递归使用桶排序进行排序;
将各个桶中排好序的数据依次输出,最后得到的数据即为最终有序。
例子:待排序的数为:3, 6, 9, 1
1)求得 mx = 9,mn = 1,n = 4
size = (9 - 1) / n + 1 = 3
cnt = (mx - mn) / size + 1 = 3
2)由上面的步骤可知,共3个桶,每个桶能放3个数,第一个桶数的范围为 [1, 4),第二个[4, 7),第三个[7, 10)
扫描一遍待排序的数,将各个数放到其对应的桶中,放完后如下图所示:

3)对各个桶中的数进行排序,得到如下图所示:

4)依次输出各个排好序的桶中的数据,即为:1, 3, 6, 9
可见,最终得到了有序的排列。
3. 时间复杂度和空间复杂度分析
最好时间复杂度 : O(n + k)
其中k为桶的个数。即当数据是均匀分散排列的,那么每个桶分到的数据个数都是一样的,这个步骤需要O(k)的书剑复杂度,在对每个桶进行排序的时候,最好情况下是数据都已经是有序的了,那么最好的排序算法的时间复杂度会是O(n),因此总的时间复杂度是 O(n + k) 。
最坏时间复杂度:O(n^2)
当对每个桶中的数据进行排序的时候,所使用的排序算法,最坏情况下是O(n^2),因此总的最坏情况下的时间复杂度为O(n^2)。
平均时间复杂度:O(n + n²/k + k) <=> O(n)
如果k是根据Θ(n)来获取的,那么平均时间复杂度就是 O(n)。
4.桶排序误区
1、如果数据分布不均,大量数据集中在少量桶里,桶排序就没有效果。
2、桶排序要时间就省不了空间,要空间就省不了时间,意义不大。
首先桶排序排序的内容是均匀分布的一串数字,不存在数据分布不均的问题。其次桶排序可以在时间和空间之间找一个点,使其满足两者。
5.代码
#include <stdio.h>
#include <stdlib.h>// 桶排序函数
void bucketSort(int arr[], int n) {// 创建桶数组int maxVal = arr[0];for (int i = 1; i < n; i++) {if (arr[i] > maxVal) {maxVal = arr[i];}}int bucket[maxVal + 1];for (int i = 0; i <= maxVal; i++) {bucket[i] = 0;}// 将元素放入桶中for (int i = 0; i < n; i++) {bucket[arr[i]]++;}// 从桶中取出元素并排序int index = 0;for (int i = 0; i <= maxVal; i++) {while (bucket[i] > 0) {arr[index++] = i;bucket[i]--;}}
}// 测试桶排序
int main() {int arr[] = {5, 2, 8, 4, 9, 1, 3, 7, 6};int n = sizeof(arr) / sizeof(arr[0]);printf("原始数组:");for (int i = 0; i < n; i++) {printf("%d ", arr[i]);}printf("\n");bucketSort(arr, n);printf("排序后数组:");for (int i = 0; i < n; i++) {printf("%d ", arr[i]);}printf("\n");return 0;
}
参考文章:桶排序详解-CSDN博客文章浏览阅读2.9k次,点赞19次,收藏30次。本文详细介绍了桶排序的基本原理,如何利用哈希表进行数据分配,以及进阶方法中如何通过区间划分和链表结构进行排序。特别强调了桶排序对数据分布均匀性的依赖和在时间和空间效率上的平衡。https://blog.csdn.net/2302_80297670/article/details/135852102?ops_request_misc=%257B%2522request%255Fid%2522%253A%25226BEB34D7-B27C-41C3-9542-2CA003EEF8BE%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=6BEB34D7-B27C-41C3-9542-2CA003EEF8BE&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_positive~default-2-135852102-null-null.142^v100^pc_search_result_base6&utm_term=%E6%A1%B6%E6%8E%92%E5%BA%8F&spm=1018.2226.3001.4187 【算法】桶排序(Bucket Sort)详解-CSDN博客文章浏览阅读2.8w次,点赞56次,收藏351次。桶排序_桶排序https://blog.csdn.net/qq_27198345/article/details/126516234?ops_request_misc=%257B%2522request%255Fid%2522%253A%25226BEB34D7-B27C-41C3-9542-2CA003EEF8BE%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=6BEB34D7-B27C-41C3-9542-2CA003EEF8BE&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_positive~default-1-126516234-null-null.142^v100^pc_search_result_base6&utm_term=%E6%A1%B6%E6%8E%92%E5%BA%8F
相关文章:
c++ 桶排序(看这一篇就够了)
1. 概述 桶排序(Bucket Sort)又称箱排序,是一种比较常用的排序算法。其算法原理是将数组分到有限数量的桶里,再对每个桶分别排好序(可以是递归使用桶排序,也可以是使用其他排序算法将每个桶分别排好序&…...
格点拉格朗日插值与PME算法
技术背景 在前面的一篇博客中,我们介绍了拉格朗日插值法的基本由来和表示形式。这里我们要介绍一种拉格朗日插值法的应用场景:格点拉格朗日插值法。这种场景的优势在于,如果我们要对整个实数空间进行求和或者积分,计算量是随着变量…...
【LVGL快速入门(二)】LVGL开源框架入门教程之框架使用(UI界面设计)
零.前置篇章 本篇前置文章为【LVGL快速入门(一)】LVGL开源框架入门教程之框架移植 一.UI设计 介绍使用之前,我们要学习一款LVGL官方的UI设计工具SquareLine Studio,使用图形化设计方式设计出我们想要的界面,然后生成对应源文件导入工程使用…...
jmeter中用csv data set config做参数化2
在jmeter中,使用csv data set config进行参数化是很重要的一个功能,但是这个功能的使用需要十分仔细和小心,因为细节之处往往决定着结果的正确与否。 举例: 一个登录接口用加密密码登录,一个登录接口用原始密码登录。…...
背包问题整理
1.01背包 题目描述 小明有一个容量为 V 的背包。 这天他去商场购物,商场一共有N 件物品,第 i 件物品的体积为 wi,价值为 vi。 小明想知道在购买的物品总体积不超过 V的情况下所能获得的最大价值为多少,请你帮他算算。 输入描述…...
基于Matlab车牌识别课程设计报告
Matlab车牌识别系统 分院(系) 信息科学与工程 专业 学生姓名 学号 设计题目 车牌识别系统设计 内容及要求: 车牌定位系统的目的在于正确获取整个图像中车牌的区域, 并识别出车牌号。通过设计实现车牌识别系…...
SSM框架实战小项目:打造高效用户管理系统 day3
前言 在前两篇博客中,后台已经搭建完毕,现在需要设计一下前端页面 webapp下的项目结构图 创建ftl文件夹,导入css和js 因为我们在后台的视图解析器中,设置了页面解析器,跳转路径为/ftl/*.ftl,所以需要ftl文件…...
一款现代化、可定制的跨平台文件浏览器,高颜值高效率的的管理神器!(附私活源码)
在如今这个注重效率的时代,我们每天都在与文件打交道。 但是,你有没有感觉到传统的文件管理器总是让人提不起劲?单调的外观,有限的功能,仿佛是上个世纪的产物。 一直以来,我都在寻找一款既颜值高又功能强…...
【C】二分查找与函数1
二分查找 练习: 给定一个整型的有序数组,在数组中找到指定的一个值,如: 1,2,3,4,5,6,7,8,9,10 找出7.如果找到了&#x…...
光纤光学的基本方程
一、麦克斯韦方程与亥姆赫兹方程 1.1 麦克斯韦方程 光纤是一种介质光波导,具有以下特点: ① 无传导电流 ② 无自由电荷 ③ 线性各向同性 推导出来的即为波动方程。为材料在真空中的磁导率,为材料在真空中的介电常数,n为材料折…...
题解:CF584D Dima and Lisa
前置知识 哥德巴赫猜想,任一大于 2 2 2 的偶数都可写成两个素数之和。 思路 我们可以分类讨论一下。 n n n 一开始就是质数。直接输出即可 n n n 是偶数,那么一定可以写成两个质数之和。那么暴力枚举两个质数即可。 如果以上均不符合,计…...
【OD】【E卷】【真题】【100分】内存资源分配(PythonJavaJavaScriptC++C)
题目描述 有一个简易内存池,内存按照大小粒度分类,每个粒度有若干个可用内存资源,用户会进行一系列内存申请,需要按需分配内存池中的资源返回申请结果成功失败列表。 分配规则如下: 分配的内存要大于等于内存的申请…...
Linux基础项目开发day05:量产工具——页面系统
文章目录 一、数据结构抽象page_manager.h 二、页面管理器page_manager.c 三、单元测试1、main.page.c2、page_test.c3、Makefile修改3.1、unittest中的Makefile3.2、page中的Makefile 四、上机实验 前言 前面实现了显示、输入、文字、UI系统,现在我们就来实现页面的…...
保护企业终端安全,天锐DLP帮助企业智能管控终端资产
为有效预防员工非法调包公司的软硬件终端资产,企业管理员必须建立高效的企业终端安全管控机制,确保能够即时洞察并确认公司所有软硬件资产的状态变化。这要求企业要有一套能够全面管理终端资产的管理系统,确保任何未经授权的资产变动都能被迅…...
2024市场营销第3次课
品牌管理 1.认识品牌 品牌定义:一个名称、术语、标志、符号或设计,或者是它们的组合,用来识别某个销售商或某一群销售商的产品或服务,并使其与竞争者的产品或服务区分开来。 品牌构成:成功品牌的构成都是由外及内的…...
Python基础之函数的定义与调用
一、函数的定义 在Python中,函数是一段可重复使用的代码块,用于完成特定的任务。可以使用def关键字来定义函数。 语法如下: def function_name(parameters): """docstring""" # function body return expres…...
GPU在AI绘画中的作用以及GPU的选择
大家好,我是Shelly,一个专注于输出AI工具和科技前沿内容的AI应用教练,体验过300款以上的AI应用工具。关注科技及大模型领域对社会的影响10年。关注我一起驾驭AI工具,拥抱AI时代的到来。 GPU在AI绘画中的作用: GPU在A…...
【火山引擎】 Chat实践 | 大模型调用实践 | python
目录 一 前期工作 二 Doubao-pro-4k_test实践 一 前期工作 1 已在火山方舟控制台在线推理页面创建了推理接入点 ,接入大语言模型并获取接入点 ID。 2 已参考安装与初始化中的步骤完成 SDK 安装和访问凭证配置...
mysql学习教程,从入门到精通,SQL 注入(42)
1、 SQL 注入 SQL 注入是一种严重的安全漏洞,它允许攻击者通过操纵 SQL 查询来访问、修改或删除数据库中的数据。由于 SQL 注入的潜在危害,我不能提供具体的恶意代码示例。然而,我可以向你展示如何防御 SQL 注入,并解释其工作原理…...
图论day60|108.冗余连接(卡码网) 、109.冗余连接II(卡码网)【并查集 摧毁信心的一题,胆小的走开!】
图论day60|108.冗余连接(卡码网)、109.冗余连接II(卡码网)【并查集 摧毁信心的一题,胆小的走开!】 108.冗余连接(卡码网)109.冗余连接II(卡码网)【并查集 摧毁…...
RocketMQ延迟消息机制
两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数,对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后…...
.Net框架,除了EF还有很多很多......
文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...
云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地
借阿里云中企出海大会的东风,以**「云启出海,智联未来|打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办,现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...
【入坑系列】TiDB 强制索引在不同库下不生效问题
文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...
Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)
目录 1.TCP的连接管理机制(1)三次握手①握手过程②对握手过程的理解 (2)四次挥手(3)握手和挥手的触发(4)状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...
关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案
问题描述:iview使用table 中type: "index",分页之后 ,索引还是从1开始,试过绑定后台返回数据的id, 这种方法可行,就是后台返回数据的每个页面id都不完全是按照从1开始的升序,因此百度了下,找到了…...
【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验
系列回顾: 在上一篇中,我们成功地为应用集成了数据库,并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了!但是,如果你仔细审视那些 API,会发现它们还很“粗糙”:有…...
【git】把本地更改提交远程新分支feature_g
创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...
【HTML-16】深入理解HTML中的块元素与行内元素
HTML元素根据其显示特性可以分为两大类:块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...
NLP学习路线图(二十三):长短期记忆网络(LSTM)
在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...
