【数据结构】排序算法系列——桶排序(附源码+图解)

news2024/10/16 16:22:51

桶排序

算法思想

桶排序(BucketSort),也被叫做箱排序,它将整个数据组分为n个相同大小的子区间,这类子区间或称为。输入数据是均匀、独立分布的,所以一般不会出现一个桶中装有过多数据的情况。作为一种排序算法,它会对每个桶中的数进行排序,然后直接遍历桶,最终就可以按照次序输出数据。
它的算法步骤大概如下所示:

  1. 设置定量数组作为每个桶的容量大小
  2. 遍历数据组,并将数据一个一个放到对应桶中
  3. 对非空桶中的数据进行排序
  4. 最后将数据按照大体排序放回原来序列中

图解

在这里插入图片描述

C语言代码解析

#define CRT_SECURE_NO_WARNINGS 1
//桶排序
#include <stdio.h>
#include <stdlib.h>	

#define MAX 1000
#define BUCKET_NUM 10

//建桶中节点
struct BNode
{
	int data;
	struct Node* next;
};

//建桶
struct BNode* CreateNode(int data)
{
	struct BNode* newNode = (struct BNode*)mlooc(sizeof(struct BNode));
	newNode->data = data;
	newNode->next = NULL;
	return newNode;
}

//插入节点到链表中
void insertNode(struct BNode* head, struct BNode* newNode)
{
	struct BNode* p = head;
	while (p->next != NULL)
	{
		p = p->next;
	}
	p->next = newNode;
}

//桶排序
void BucketSort(int arr[], int n)
{
	struct BNode* bucket[BUCKET_NUM];
	for (int i = 0; i < BUCKET_NUM; i++)
	{
		bucket[i] = CreateNode(0);//创建多个桶
	}
	for (int i = 0; i < n; i++)
	{
		int index = arr[i] / BUCKET_NUM;//确定元素所在桶的位置
		struct BNode* newNode = CreateNode(arr[i]);
		insertNode(bucket[index], newNode);//插入节点到链表中
	}
	for (int i = 0; i < BUCKET_NUM; i++)//对每个桶进行排序
	{
		struct BNode* p = bucket[i]->next;
		while (p != NULL)
		{
			printf("%d ", p->data);
			p = p->next;
		}
	}
}

时间复杂度

桶排序的时间复杂度取决于以下几个因素:

  1. 将数据分配到桶的时间
  2. 对每个桶内的数据进行排序的时间
  3. 合并所有桶中的数据的时间

假设我们有 n 个元素需要排序,并且我们使用了 k 个桶。

1. 将数据分配到桶的时间复杂度

将每个元素放入对应的桶中的操作通常是一个线性的操作。对于每一个元素,确定它所属的桶位置的时间是 O(1) 的,总的时间复杂度为 O(n)。

2. 对每个桶内的数据进行排序的时间复杂度

每个桶中的数据数量决定了桶内排序的复杂度。如果所有元素均匀分布到 k 个桶中,那么每个桶中的元素大约是 n/k 个。通常,我们会在每个桶内使用一种常规的排序算法(如快速排序或插入排序)来对桶内的元素排序。

  • 如果使用插入排序或其他 O((n/k)^2) 的排序算法来对每个桶排序,那么对所有桶排序的时间复杂度为 O(k * (n/k)^2) = O(n^2/k)。
  • 如果使用更高效的排序算法(如快速排序,时间复杂度为 O((n/k) * log(n/k))),那么对每个桶排序的时间复杂度为 O(n/k * log(n/k)),所有桶的总排序时间复杂度为 O(n * log(n/k))。
3. 合并所有桶中的数据的时间复杂度

在所有桶都排序好之后,需要将它们合并起来,这个步骤的时间复杂度是 O(n)。

综合时间复杂度

综合上述三部分的分析,桶排序的平均时间复杂度为:

O(n) + O(n \log(n/k)) + O(n) = O(n \log(n/k))

桶排序的最坏情况时间复杂度

桶排序的最坏情况发生在所有元素都被分配到一个桶中,导致排序退化为对所有 n 个元素进行一次 O(n log n) 的排序。在这种情况下,桶排序的时间复杂度为:

O(n \log n)

总而言之,桶排序在数据分布均匀的情况下效率非常高,但如果数据分布不均匀或者不适合划分到桶中时,可能会退化为更高的复杂度。

稳定性

桶排序是否稳定取决于我们将元素插入桶中时是否会改变元素的相对顺序。

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

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

相关文章

160页PPT | 埃森哲-制造业变革转型八大领域:痛点剖析与改进策略

PT下载链接见文末~ 引言&#xff1a;制造业数字化转型规划 制造业正处于数字化转型的关键时期&#xff0c;旨在通过技术革新和流程优化&#xff0c;灵活应对市场波动&#xff0c;强化竞争优势&#xff0c;并紧跟技术进步的步伐。此规划围绕三大核心要素展开&#xff1a; 1、…

Pytest中fixture的scope详解

pytest作为Python技术栈下最主流的测试框架&#xff0c;功能极为强大和灵活。其中Fixture夹具是它的核心。而且pytest中对Fixture的作用范围也做了不同区分&#xff0c;能为我们利用fixture带来很好地灵活性。 下面我们就来了解下这里不同scope的作用 fixture的scope定义 首…

8.优化存储过程的性能(8/10)

优化存储过程的性能 1.引言 存储过程是数据库系统中预先编写好的SQL语句集合&#xff0c;它们被保存在数据库服务器上&#xff0c;可以在需要时被调用执行。存储过程的使用可以提高数据库操作的效率&#xff0c;减少网络通信&#xff0c;并且可以封装复杂的逻辑&#xff0c;使…

中科星图GVE(案例)——AI实现建筑用地变化前后对比情况

目录 简介 函数 gve.Services.AI.ConstructionLandChangeExtraction(image1,image2) 代码 结果 知识星球 机器学习 简介 AI可以通过分析卫星图像、航拍影像或其他地理信息数据&#xff0c;实现建筑用地变化前后对比。以下是一种可能的实现方法&#xff1a; 数据获取&am…

全能PDF工具集 | PDF Shaper Ultimate v14.6 便携版

软件简介 PDF Shaper是一款功能强大的PDF工具集&#xff0c;它提供了一系列用于处理PDF文档的工具。这款软件使用户能够轻松地转换、分割、合并、提取页面以及旋转和加密PDF文件。PDF Shaper的界面简洁直观&#xff0c;使得即使是新手用户也能快速上手。它支持广泛的功能&…

牛客一>DP34 【模板】前缀和

1.题目&#xff1a; 【模板】前缀和_牛客题霸_牛客网 2.解析&#xff1a;这里可以看成一个缩小版动态规划 代码&#xff1a; import java.util.Scanner;// 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main {public static void main(String[] args) {Scan…

【无人机设计与控制】滑模控制、反步控制、传统PID四旋翼无人机轨迹跟踪控制仿真

摘要 本文基于滑模控制、反步控制和传统PID控制&#xff0c;设计了针对四旋翼无人机的轨迹跟踪控制系统。通过对比这三种控制策略在四旋翼无人机轨迹跟踪中的表现&#xff0c;分析了各自的优缺点和适用场景。仿真结果表明&#xff0c;滑模控制具有更强的鲁棒性&#xff0c;反步…

Windows 远程桌面提示没有远程桌面授权服务器可以提供许可证 无法保存对 graceperiod 权限所作的更改

参考文章&#xff1a;远程连接提示 由于没有远程桌面授权服务器提供许可证 Windows 远程桌面提示没有远程桌面授权服务器可以提供许可证 远程桌面到windows服务器上时报错&#xff1a;由于没有远程桌面授权服务器可以提供许可证&#xff0c;远程会话被中断。请跟服务器管理员…

系统缺失mfc140.dll的修复方法,有效修复错误mfc140.dll详细步骤

mfc140.dll丢失原因分析 1 系统文件损坏或病毒感染 系统文件损坏或被病毒感染是导致mfc140.dll丢失的常见原因之一。根据用户反馈和安全研究报告&#xff0c;大约有30%的mfc140.dll丢失案例与系统文件损坏或病毒感染有关。病毒、木马或其他恶意软件可能会破坏或删除系统中的m…

kafka-manager修改zookeeper端口号后启动仍然连接2181端口

问题描述&#xff1a; zookeeper默认端口号修改为了2182&#xff0c;kafka-manager的配置文件application.conf中也已经修改了zkhosts为新的端口号&#xff0c;然而启动kafka-manger时报错连接连接超时&#xff0c;发现连接的还是2181端口&#xff0c;很奇怪&#xff1f;&…

大语言模型入门(五)——思维链

一、什么是思维链 思维链&#xff08;Chain-of-Thought&#xff0c;简称CoT&#xff09;是一种在大型语言模型&#xff08;LLMs&#xff09;中使用的技术&#xff0c;旨在提升模型在复杂推理任务上的表现。这种方法通过模拟人类解决问题时的思考过程&#xff0c;将问题分解为一…

信号量(Semaphore)是什么,如何使用?

信号量&#xff08;Semaphore&#xff09;是 Java java.util.concurrent 包中的一种同步辅助类&#xff0c;用于控制对共享资源的访问。在并发编程中&#xff0c;信号量常用于限制同时访问特定资源的线程数量&#xff0c;避免过多线程同时访问可能导致的资源竞争或性能下降。 …

verilog 介绍(附状态机实例)

author: hjjdebug date: 2024年 10月 12日 星期六 15:02:56 CST description: verilog 介绍(附状态机实例) 初学者可以把菜鸟教程中的verilog 当参考手册. 但那里介绍的太多了,精简入门(或者入门后的概括&#xff09;看看本博就够了. 1. 什么是HDL ? HDL, hardware descrip…

FPM工具制作RPM包

文章目录 一、fpm工具介绍1、什么是fpm?2、fpm技术分析3、fpm应用场景4、fpm与rpmbuild的区别 二、fpm安装及构建操作1、安装fpm工具1.1、安装ruby环境1.2、Ruby Gems源更换为国内的源1.3、删除官方源1.4、查看当前源列表1.5、安装fpm版本1.5.1、报错解决 2、fpm常用参数 三、…

Kaggle竞赛——森林覆盖类型分类

目录 1. 竞赛简要2. 数据分析2.1 特征类型统计2.2 四个荒野区域数据分析2.3 连续特征分析2.4 离散特征分析2.5 特征相关性热图2.6 特征间的散点关系图 3. 特征工程3.1 特征组合3.2 连续特征标准化 4. 模型搭建4.1 模型定义4.2 绘制混淆矩阵和ROC曲线4.3 模型对比与选择 5. 测试…

详解安卓和IOS的唤起APP的机制,包括第三方平台的唤起方法比如微信

网页唤起APP是一种常见的跨平台交互方式&#xff0c;它允许用户从网页直接跳转到移动应用程序。 这种技术广泛应用于各种场景&#xff0c;比如让用户在浏览器中点击链接后直接打开某个应用&#xff0c;或者从网页引导用户下载安装应用。实现这一功能主要依赖于URL Scheme、Univ…

线性代数 行列式

一、行列式 1、定义 一个数学概念&#xff0c;主要用于 线性代数中&#xff0c;它是一个可以从方阵&#xff08;即行数和列数相等的矩阵&#xff09;形成的一个标量&#xff08;即一个单一的数值&#xff09; 2、二阶行列式 &#xff0c;像这样将一个式子收缩称为一个 2*2 的…

校车购票微信小程序的设计与实现(lw+演示+源码+运行)

摘 要 由于APP软件在开发以及运营上面所需成本较高&#xff0c;而用户手机需要安装各种APP软件&#xff0c;因此占用用户过多的手机存储空间&#xff0c;导致用户手机运行缓慢&#xff0c;体验度比较差&#xff0c;进而导致用户会卸载非必要的APP&#xff0c;倒逼管理者必须改…

基于深度学习的细粒度图像分析综述【翻译】

&#x1f947; 版权: 本文由【墨理学AI】原创首发、各位读者大大、敬请查阅、感谢三连 &#x1f389; 声明: 作为全网 AI 领域 干货最多的博主之一&#xff0c;❤️ 不负光阴不负卿 ❤️ 文章目录 基础信息0 摘要1 INTRODUCTION2 识别与检索 RECOGNITION VS. RETRIEVAL3 问题和…

腾讯云视立方TRTCCalling Web 相关

基础问题 什么是 TRTCCalling&#xff1f; TRTCCalling 是在 TRTC 和 TIM 的基础上诞生的一款快速集成的音视频的解决方案。支持1v1和多人视频/语音通话。 TRTCCalling 是否支持接受 roomID 为字符串? roomID 可以 string&#xff0c;但只限于数字字符串。 环境问题 Web …