当前位置: 首页 > news >正文

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

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

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

桶排序适用于数据分布比较均匀,或者比较侧重于区间数量的情况。例如,假设我们有一个数组 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 中都有相应的实现方法,通过分析这些代码示例,可以更好地理解桶排序算法的原理和应用。

相关文章:

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

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

AI时代,服务器厂商能否打破薄利的命运?

文&#xff5c;刘俊宏 编&#xff5c;王一粟 AI大模型正在引发新一轮的“算力焦渴”。 近日&#xff0c;OpenAI刚发布的o1大模型再次刷新了大模型能力的上限。对比上一次迭代的版本&#xff0c;o1的推理能力全方位“吊打”了GPT-4o。更优秀的能力&#xff0c;来自与o1将思维…...

2024年9月python二级易错题和难题大全(附详细解析)(二)

2024年9月python二级易错题和难题大全(附详细解析)(二) 第1题第2题第3题第4题第5题第6题第7题第8题第9题第10题第11题第12题第13题第14题第15题第16题第17题第18题第19题第20题第1题 1、以下代码的输出结果是() x = 12 + 3 * ((5 * 8) - 14) // 6 print(x) A、25.0 B、6…...

4.结构型设计模式 - 第1回:引言与适配器模式 (Adapter Pattern) ——设计模式入门系列

一、引言 在现代软件开发中&#xff0c;设计模式是帮助我们解决复杂问题的工具&#xff0c;它们提供了在常见场景下重用已验证解决方案的途径。而结构型设计模式主要关注类与对象之间的组合方式&#xff0c;旨在通过增强灵活性和降低耦合度来改进代码的结构。 本次讨论的是结…...

解决mybatis plus 中 FastjsonTypeHandler无法正确反序列化List类型的问题

由于是根据自动映射类型&#xff0c;我们设置的字段类型是List 也就是反序列化的时候也只是用 FastjsonTypeHandler中的 Override protected Object parse(String json) { return JSON.parseObject(json, type); } 反序列化方法&#xff0c;这是type为List 反序列后我们并没…...

MacOS安装homebrew,jEnv,多版本JDK

1 安装homebrew homebrew官网 根据官网提示&#xff0c;运行安装命令 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"安装后&#xff0c;bash会提示执行两条命令 (echo; echo eval "$(/opt/homebrew/b…...

【HTTP】认识 URL 和 URL encode

文章目录 认识 URLURL 基本格式**带层次的文件路径****查询字符串****片段标识符** URL encode 认识 URL 计算机中非常重要的概念&#xff0c;并不仅仅是在 HTTP 中使用。用来描述一个网络资源所处的位置&#xff0c;全称“唯一资源定位符” URI 是“唯一资源标识符“严格的说…...

【AI学习笔记】初学机器学习西瓜书概要记录(二)常用的机器学习方法篇

初学机器学习西瓜书的概要记录&#xff08;一&#xff09;机器学习基础知识篇(已完结) 初学机器学习西瓜书的概要记录&#xff08;二&#xff09;常用的机器学习方法篇(持续更新) 初学机器学习西瓜书的概要记录&#xff08;三&#xff09;进阶知识篇(待更) 文字公式撰写不易&am…...

[SDX35+WCN6856]SDX35 + WCN6856 默认增加打包wifi配置hostapd_24g.conf和hostapd_5g.conf操作方法

SDX35 SDX35介绍 SDX35设备是一种多模调制解调器芯片,支持 4G/5G sub-6 技术。它是一个4nm芯片专为实现卓越的性能和能效而设计。它包括一个 1.9 GHz Cortex-A7 应用处理器。 SDX35主要特性 ■ 3GPP Rel. 17 with 5G Reduced Capability (RedCap) support. Backward compati…...

【iOS】OC高级编程 iOS多线程与内存管理阅读笔记——自动引用计数

文章目录 什么是自动引用计数 内存管理/引用计数 概要 内存管理的思考方式 自己生成的对象&#xff0c;自己所持有 非自己生成的对象&#xff0c;自己也能持有 不再需要自己持有的对象时释放 无法释放非自己持有的对象 什么是自动引用计数 自动引用计数&#xff08;AR…...

网络安全-LD_PRELOAD,请求劫持

目录 一、环境 二、开始做题 三、总结原理 四、如何防护 一、环境 我们这里用蚁剑自带的靶场第一关来解释 docker制作一下即可 二、开始做题 首先环境内很明显给我们已经写好了webshell 同样我们也可以访问到 我们使用这个蚁剑把这个webshell连上 我们发现命令不能执行&am…...

GO入门之值传递于引用(指针、内存地址)传递扫盲

GO入门之值传递于引用&#xff08;指针、内存地址&#xff09;传递扫盲 Go 语言中&#xff0c;值传递和引用&#xff08;指针&#xff09;传递是两个关键的概念。通过案例可以很好地展示两者的区别。 值传递与引用传递的区别&#xff1a; 值传递&#xff1a;传递的是变量的副…...

【渗透测试】-vulnhub源码框架漏洞-Os-hackNos-1

vulnhub源码框架漏洞中的CVE-2018-7600-Drupal 7.57 文章目录  前言 1.靶场搭建&#xff1a; 2.信息搜集&#xff1a; 主机探测&#xff1a; 端口扫描&#xff1a; 目录扫描&#xff1a; 3.分析&#xff1a; 4.步骤&#xff1a; 1.下载CVE-2018-7600的exp 2.执行exp: 3.写入木…...

sqli-lab靶场学习(三)——Less8-10(盲注、时间盲注)

Less8 第八关依然是先看一般状态 http://localhost/sqli-labs/Less-8/?id1 然后用单引号闭合&#xff1a; http://localhost/sqli-labs/Less-8/?id1 这关的问题在于报错是不显示&#xff0c;那没办法通过上篇文章的updatexml大法处理。对于这种情况&#xff0c;需要用“盲…...

Pybullet 安装过程

Pybullet 安装过程&#xff08;windows&#xff09; 1. 安装C编译工具2. 安装Pybullet 1. 安装C编译工具 pybullet 需要C编译套件&#xff0c;直接装之前检查下&#xff0c;要不会报缺少某版本MVSC的error&#xff0c;最好的方式是直接下载visual studio&#xff0c;直接按默认…...

Error when custom data is added to Azure OpenAI Service Deployment

题意&#xff1a;在向 Azure OpenAI 服务部署添加自定义数据时出现错误。 问题背景&#xff1a; I receive the following error when adding my custom data which is a .txt file (it doesnt matter whether I add it via Azure Cognitive Search, Azure Blob Storage, or F…...

libreoffice word转pdf

一、准备一个word文件 运行&#xff1a; cd /root libreoffice --headless --convert-to pdf --outdir /root/output doc1.docx 发现中文乱码&#xff1a; 此时我们需要给linux 上添加中文字体&#xff1a; centos7 添加中文字体 再次运行正常&#xff1a; libreoffice --h…...

java -----泛型

泛型的理解和好处 泛型是在JDK5之后引入的一个新特性&#xff0c;可以在编译阶段约束操作的数据类型&#xff0c;并进行检查。 泛型的格式为 <数据类型> import java.util.ArrayList;SuppressWarnings({"all"}) public class Generic02 {public static void…...

Springboot 文件上传下载相关问题

文章目录 关于Springboot 文件上传下载问题解决方案注意事项文件上传文件下载文件删除文件在线打开在写练习的时候&#xff0c;发现了一些小小的问题&#xff0c;已经在 上述代码中体现。① 代码路径碰到中文的时候&#xff0c;会有乱码&#xff0c;需要转换&#xff08;内容中…...

【Kotlin 与 Java 互操作】Java中调用带有默认值的Kotlin函数(十四)

导读大纲 1.0.1 Java 没有默认参数值的概念1.0.2 使用 JvmOverloads 来简化调用 1.0.1 Java 没有默认参数值的概念 因此当从 Java 调用带有默认参数值的 Kotlin 函数时 1. 必须明确指定所有参数值 fun <T> joinToString(collection: Collection<T>,separator: St…...

React第五十七节 Router中RouterProvider使用详解及注意事项

前言 在 React Router v6.4 中&#xff0c;RouterProvider 是一个核心组件&#xff0c;用于提供基于数据路由&#xff08;data routers&#xff09;的新型路由方案。 它替代了传统的 <BrowserRouter>&#xff0c;支持更强大的数据加载和操作功能&#xff08;如 loader 和…...

第25节 Node.js 断言测试

Node.js的assert模块主要用于编写程序的单元测试时使用&#xff0c;通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试&#xff0c;通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...

【单片机期末】单片机系统设计

主要内容&#xff1a;系统状态机&#xff0c;系统时基&#xff0c;系统需求分析&#xff0c;系统构建&#xff0c;系统状态流图 一、题目要求 二、绘制系统状态流图 题目&#xff1a;根据上述描述绘制系统状态流图&#xff0c;注明状态转移条件及方向。 三、利用定时器产生时…...

selenium学习实战【Python爬虫】

selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...

蓝桥杯3498 01串的熵

问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798&#xff0c; 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...

【生成模型】视频生成论文调研

工作清单 上游应用方向&#xff1a;控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...

NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合

在汽车智能化的汹涌浪潮中&#xff0c;车辆不再仅仅是传统的交通工具&#xff0c;而是逐步演变为高度智能的移动终端。这一转变的核心支撑&#xff0c;来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒&#xff08;T-Box&#xff09;方案&#xff1a;NXP S32K146 与…...

LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》

这段 Python 代码是一个完整的 知识库数据库操作模块&#xff0c;用于对本地知识库系统中的知识库进行增删改查&#xff08;CRUD&#xff09;操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 &#x1f4d8; 一、整体功能概述 该模块…...

uniapp 开发ios, xcode 提交app store connect 和 testflight内测

uniapp 中配置 配置manifest 文档&#xff1a;manifest.json 应用配置 | uni-app官网 hbuilderx中本地打包 下载IOS最新SDK 开发环境 | uni小程序SDK hbulderx 版本号&#xff1a;4.66 对应的sdk版本 4.66 两者必须一致 本地打包的资源导入到SDK 导入资源 | uni小程序SDK …...

ZYNQ学习记录FPGA(一)ZYNQ简介

一、知识准备 1.一些术语,缩写和概念&#xff1a; 1&#xff09;ZYNQ全称&#xff1a;ZYNQ7000 All Pgrammable SoC 2&#xff09;SoC:system on chips(片上系统)&#xff0c;对比集成电路的SoB&#xff08;system on board&#xff09; 3&#xff09;ARM&#xff1a;处理器…...