【最快最简单的排序 —— 桶排序算法】

最快最简单的排序 —— 桶排序算法

桶排序是一种排序算法,其工作原理是将数据分到有限数量的桶子里,然后对每个桶内的元素进行单独排序,最后依次把各个桶中的记录列出来。桶排序的效率取决于映射函数的选择和桶的数量。

桶排序适用于数据分布比较均匀,或者比较侧重于区间数量的情况。例如,假设我们有一个数组 arr = (63, 157, 189, 51, 101, 47, 141, 121, 157, 156, 194, 117, 98, 139, 67, 133, 181, 13, 28, 109),我们想要对它进行升序排列。首先确定数组中的最大值和最小值,以及每个桶的大小。然后创建一个长度为对应桶数的数组,每个元素是一个空列表,用来存放对应范围内的元素。接着遍历原始数组,根据每个元素值和最小值之差除以桶大小得到它应该放入哪个桶中。

以下是 C++代码示例:

int main() {int a(10)={0}; //以 10 个桶为例,必须将 10 个桶初始值设为 0int n; //要输入的数字个数scanf("%d",&n);int i,j;for(i=0;i<n;i++) {int key;scanf("%d",&key);a(key)++; //输入 key,key 会放在 a(key)中,同时 a(key)++记录了该桶存放的数据+1}for(i=0;i<10;i++) //这里表示将这 10 个桶里面的数全部输出,如果写 n,则输出到 n 桶就停止了,如果有比 n 要大的数字即存放在了 n 桶后面就无法输出for(j=0;j<a(i);j++) //小于 a(i) ,一个桶里面可能有好几个一样的数字printf("%d ",i);return 0;
}

Python 代码示例:

def bucket_sort(arr):if len(arr)==0:return arr# 找到最大值和最小值min_val, max_val = min(arr), max(arr)# 创建桶的数量。这里创建了比最大值和最小值范围稍大的桶数量bucket_range = (max_val - min_val)/len(arr)# 创建桶buckets = [[] for _ in range(len(arr)+1)]# 将数组中的元素分配到桶里for num in arr:buckets[int((num - min_val)/ bucket_range)].append(num)# 对每个桶进行排序,然后合并arr = []for bucket in buckets:# 这里使用了内置的排序函数,可以是其他排序算法bucket.sort()arr.extend(bucket)return arr
# 示例
arr = 
sorted_arr = bucket_sort(arr)
print(sorted_arr)

总之,桶排序在数据分布均匀时效率较高,但如果数据分布不均衡,可能会导致性能下降和浪费空间。

桶排序算法原理

桶排序(Bucket sort)是一种基于计数的排序算法。其基本思想是将待排序的数据分到有限数量的桶里,然后对每个桶中的数据进行排序,最后将所有桶中的数据按顺序合并起来。
具体原理如下:

  • 确定桶的数量及每个桶对应的数据范围。通常,桶的数量和待排序数据的范围有关,每个桶应尽可能均匀地包含一部分数据。例如,如果要对一组范围在的整数进行排序,可以根据数据的分布情况选择合适的桶数量,比如分成10个桶,每个桶对应的数据范围就是[0,10)、[10,20)、[20,30)等。
  • **遍历待排序序列,将每个元素放入对应的桶中。**这一步相当于对数据进行初步的划分和聚集。例如,对于数据53,若分成10个桶,根据计算可得它应该放入第6个桶中。
  • 对每个非空桶内部使用其他排序算法(如插入排序、快速排序等)进行排序,确保每个桶内的数据有序。这样做的目的是因为桶内的数据量通常比较小,使用一些简单的排序算法可以快速完成排序。
  • 按照桶的顺序,依次从每个桶中取出元素,合并成一个有序序列,即完成整个数据集的排序。

桶排序算法适用场景

桶排序算法适用于特定的数据分布情况。

  • 当数据分布相对均匀时,桶排序算法非常适用。例如,在一个统计学生成绩的场景中,成绩通常分布在一定的范围内,且比较均匀。如果要对大量学生的成绩进行排序,桶排序可以将成绩划分到不同的桶中,每个桶对应一个成绩区间,然后对每个桶内的成绩进行排序,最后合并得到有序的成绩列表。
  • 当数据范围已知,可以将数据映射到有限数量的桶中时,桶排序也是一个不错的选择。比如,对一组范围在的整数进行排序,可以根据这个范围确定合适的桶数量,然后将数据分配到各个桶中进行排序。
  • 桶排序算法不适合数据分布非常广泛的情况。如果数据分布非常广泛,导致需要大量的桶,从而造成空间和时间的浪费。例如,对一组随机生成的整数进行排序,这些整数的范围非常大,使用桶排序可能需要创建大量的桶,占用大量的内存空间,而且分配元素到桶中的时间也会很长。
  • 数据量非常大时,即使每个桶的元素少,桶的数量可能会非常多。在这种情况下,桶排序的效率也可能会降低。比如,对海量的大数据进行排序,虽然每个桶中的数据量可能很少,但由于数据量巨大,桶的数量会非常多,这会增加合并桶的时间和复杂度。

桶排序算法 C++代码示例分析

以下是一个 C++实现桶排序的示例代码分析:

void bucketSort(int arr[], int len) {// 确定最大值和最小值int max = INT_MIN; int min = INT_MAX;for (int i = 0; i < len; i++) {if (arr[i] > max) max = arr[i];if (arr[i] < min) min = arr[i];}// 生成桶数组// 设置最小的值为索引0,每个桶间隔为1int bucketLen = max - min + 1;// 初始化桶int bucket[bucketLen];for (int i = 0; i < bucketLen; i++) bucket[i] = 0;// 放入桶中int index = 0;for (int i = 0; i < len; i++) {index = arr[i] - min;bucket[index] += 1;}// 替换原序列int start = 0;for (int i = 0; i < bucketLen; i++) {for (int j = start; j < start + bucket[i]; j++) {arr[j] = min + i;}start += bucket[i];}
}

在这段代码中,首先确定待排序数组的最大值和最小值,然后根据这个范围生成桶数组。接着,遍历待排序数组,将每个元素放入对应的桶中,并统计每个桶中的元素数量。最后,按照桶的顺序,将桶中的元素依次取出,替换原序列中的元素,从而实现排序。
这个实现过程体现了桶排序的基本思想。通过确定数据范围,合理分配元素到桶中,再对每个桶进行简单的计数操作,最后合并桶中的元素,完成排序。这种方法在处理整数排序时比较有效,尤其是当数据分布相对均匀时,可以快速完成排序。

桶排序算法 Python 代码示例分析

以下是一个 Python 实现桶排序的示例代码分析:

def bucket_sort(arr):if len(arr) == 0:return arr# 找到最大值和最小值min_val, max_val = min(arr), max(arr)# 创建桶的数量。这里创建了比最大值和最小值范围稍大的桶数量bucket_range = (max_val - min_val) / len(arr)# 创建桶buckets = [[] for _ in range(len(arr)+1)]# 将数组中的元素分配到桶里for num in arr:buckets[int((num - min_val) / bucket_range)].append(num)# 对每个桶进行排序,然后合并arr = []for bucket in buckets:# 这里使用了内置的排序函数,可以是其他排序算法bucket.sort()arr.extend(bucket)return arr

在这个 Python 实现中,首先找到待排序数组的最大值和最小值,然后根据这个范围确定桶的数量。接着,遍历数组,将每个元素分配到对应的桶中。对于每个非空桶,使用内置的排序函数进行排序。最后,将所有桶中的元素合并起来,得到排序后的数组。
这个实现展示了 Python 语言的简洁性和灵活性。通过使用列表推导式创建桶,以及内置的排序函数进行桶内排序,使得代码简洁易懂。同时,可以根据实际情况选择不同的桶内排序算法,提高算法的灵活性和效率。

总结

桶排序算法是一种基于计数的排序算法,适用于特定的数据分布情况。其效率受到数据分布、桶的数量和桶内排序算法的选择等因素的影响。在 C++和 Python 中都有相应的实现方法,通过分析这些代码示例,可以更好地理解桶排序算法的原理和应用。

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

解决 TortoiseGitPlink Fatal Error:深入解析

解决 TortoiseGitPlink Fatal Error&#xff1a;深入解析 在 Windows 平台上&#xff0c;开发者使用 Git 和 TortoiseGit 进行版本控制时&#xff0c;有时会遇到 TortoiseGitPlink Fatal Error。该错误通常是在推送/拉取代码时&#xff0c;客户端未能提供正确的 SSH 密钥。 1…

Unreal Engine 5 C++: Asset Batch Duplication插件编写02

目录 准备工作 "Scripting library" 三个最重要的功能&#xff08;前两个是UEditorUtilityLibrary中的&#xff09; 自动创建声明&#xff1a; TArray T 的含义 F 的含义 Live Coding &#xff08;Ctrlalt F11&#xff09; Live Coding 的工作流程&#xff…

SpringCloud-07 GateWay01 网关技术

Spring Cloud Gateway组件的核心是一系列的过滤器&#xff0c;通过这些过滤器可以将客户端发送的请求转发(路由)到对应的微服务。 Spring Cloud Gateway是加在整个微服务最前沿的防火墙和代理器&#xff0c;隐藏微服务结点IP端口信息&#xff0c;从而加强安全保护。Spring Clou…

PHP、Java等其他语言转Go时选择GoFly快速快速开发框架指南

概要 经过一年多的发展GoFly快速开发框架已被一千多家科技企业或开发者用于项目开发&#xff0c;它的简单易学得到其他语言转Go首选框架。且企业版的发展为GoFly社区提供资金&#xff0c;这使得GoFly快速框架得到良好的发展&#xff0c;GoFly技术团队加大投入反哺科技企业和开…

科研绘图系列:R语言ggplot2画热图(heatmap)

文章目录 介绍加载R包导入数据数据预处理画图导出数据系统信息介绍 热图(Heatmap)是一种数据可视化技术,它通过颜色的变化来表示数据的大小或者密度。热图通常用于展示两个变量之间的关系,或者在二维空间上展示数据的分布情况。以下是热图可以表示的一些内容: 数据分布:…

「C++系列」动态内存

【人工智能教程】&#xff0c;前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。 点击跳转到网站&#xff1a;【人工智能教程】 文章目录 一、动态内存1. 使用new和delete①分配单个对象②分配对象数组 2. …

python全栈学习记录(十七)logging、json与pickle、time与datatime、random

logging、json与pickle、time与datatime、random 文章目录 logging、json与pickle、time与datatime、random一、logging二.json与pickle三.time与datatime四.random 一、logging logging模块用来记录日志信息。 import logging # 进行基本的日志配置 logging.basicConfig( fi…

图文深入理解SQL语句的执行过程

List item 本文将深入介绍SQL语句的执行过程。 一.在RDBMS&#xff08;关系型DB&#xff09;中&#xff0c;看似很简单的一条已写入DB内存的SQL语句执行过程却非常复杂&#xff0c;也就是说&#xff0c;你执行了一条诸如select count(*) where id 001 from table_name的非常简…

[WMCTF2020]Make PHP Great Again 2.01

又是php代码审计,开始吧. 这不用审吧&#xff0c;啊喂. 意思就是我们要利用require_once()函数和传入的file的value去读取flag的内容.&#xff0c;貌似呢require_once()已经被用过一次了&#xff0c;直接读取还不行&#xff0c;看一下下面的知识点. require_once() require…

WebLogic 漏洞复现

1、后台弱⼝令GetShell 默认账号密码&#xff1a;weblogic/Oracle123 weblogic常⽤弱⼝令&#xff1a;https://cirt.net/passwords?criteriaweblogic 这⾥注意&#xff0c; 单个账号错误密码5次之后就会⾃动锁定。 http://47.121.212.195:7001/console 2、登录后台后&#…

恒生科指八连涨,汽车股强势

9月20日电 周五&#xff0c;港股三大股指集体收涨。恒生指数涨1.36%报18258.57点&#xff0c;连续第六个交易日上涨&#xff1b;恒生科技指数涨1.43%报3703.84点&#xff0c;连续第八个交易日上涨&#xff0c;创逾两个月来新高&#xff1b;恒生中国企业指数涨1.21%报6381.5点&a…

项目扩展五:交互式:command-line interface版本的实现

项目扩展五&#xff1a;command-line interface版本的实现 一、CLI交互的设计1.为何要设计这个CLI交互2.具体设计1.启动服务2.选择信道3.选择虚拟机4.正式业务注意&#xff1a;1.消费者与生产者跟信道的关系2.消息处理回调函数的问题3.消息确认的问题 5.其他功能1.打印功能2.查…

STM32精确控制步进电机

目的&#xff1a;学习使用STM32电机驱动器步进电机&#xff0c;进行电机运动精确控制。 测试环境&#xff1a; MCU主控芯片STM32F103RCT6 &#xff1b;A4988步进电机驱动器模块&#xff1b;微型2相4线步进电机10mm丝杆滑台&#xff0c;金属丝杆安装有滑块。 10mm二相四线微型…

机器学习之非监督学习(二)异常检测(基于高斯概率密度)

机器学习之非监督学习&#xff08;二&#xff09;异常检测&#xff08;基于高斯概率密度&#xff09; 0. 文章传送1.案例引入2.高斯正态分布3.异常检测算法4.异常检测 vs 监督学习5.算法优化6.代码实现 0. 文章传送 机器学习之监督学习&#xff08;一&#xff09;线性回归、多…

C语言中数组和字符串的联系

一、C语言中&#xff0c;数组和字符串 1、C语言中&#xff0c;定义一个数组后&#xff0c;数组名保存的是这个数组的首地址。类似一个指向数组第一个元素的指针&#xff0c;但是这个指针不能重新指向。2、字符串在C语言中是通过字符数组来实现的&#xff0c;也就是说字符串还是…

【小沐学CAD】3ds Max常见操作汇总

文章目录 1、简介2、二次开发2.1 C 和 3ds Max C SDK2.2 NET 和 3ds Max .NET API2.3 3ds Max 中的 Python 脚本2.4 3ds Max 中的 MAXScript 脚本 3、快捷键3.1 3Dmax键快捷键命令——按字母排序3.2 3dmax快捷键命令——数字键3.3 3dmax功能键快捷键命令3.4 3Dmax常用快捷键——…

Elasticsearch 完整格式的 URL 进行分词,有什么好的解决方案吗?

1、问题描述 我想对完整格式的 url 进行分词&#xff0c;请问有什么好的解决方案吗&#xff1f; 比如&#xff1a;https://www.abc.com/any/path?param_1some&param-2other#title 看了官方的分词器&#xff0c;感觉没啥合适的? 预处理的话&#xff0c;又不知道该怎么处理…

Unity对象池的高级写法 (Plus优化版)

唐老师关于对物体分类的OOD的写法确实十分好&#xff0c;代码也耦合度也低&#xff0c;但是我有个简单的写法同样能实现一样的效果&#xff0c;所以我就充分发挥了一下主观能动性 相较于基本功能&#xff0c;这一版做出了如下改动 1.限制了对象池最大数量&#xff0c;多出来的…

C++11 可变的模板参数

前言 本期我们接着继续介绍C11的新特性&#xff0c;本期我们介绍的这个新特性是很多人都感觉抽象的语法&#xff01;它就是可变的模板参数&#xff01; 目录 前言 一、可变的模板参数 1.1可变的参数列表 1.2可变的参数包 1.3可变参数包的解析 • 递归展开解析 • 逗号…

微服务Docker相关指令

1、拉取容器到镜像仓库 docker pull xxx //拉取指令到 镜像仓库 例如 docker pull mysql 、docker pull nginx docker images //查看镜像仓库 2、删除资源 2.1、删除镜像仓库中的资源 docker rmi mysql:latest //删除方式一&#xff1a;格式 docker rmi 要…