桶排序和计数排序(非比较排序算法)

桶排序

桶排序是一种基于分配的排序算法,特别适合用来排序均匀分布的数据。它的基本思想是将输入的数据分到有限数量的桶里,然后对每个桶内的数据分别进行排序,最后再将各个桶内的数据合并得到最终的排序结果。(通常用于浮点数,因为浮点数是有范围的比如说0.2在0和1之间,1.4在1和2之间)

计入我们要给一串数组排序,我们用桶排序应该怎么排序呢?
在这里插入图片描述

桶排序的步骤:

1.创建桶:根据输入数据的范围,创建若干个桶。
2.数据分配:遍历输入数组,将每个元素放入相应的桶中。
3.桶内排序:对每个非空桶进行排序。可以使用其他的排序算法,如插入排序或快速排序。
4.合并结果:将所有非空桶中的数据按顺序合并起来,形成排序后的数组。

桶排序的时间复杂度:

平均时间复杂度:O(n + k),其中n是待排序元素的数量,k是桶的数量。通常情况下,k 与 n 是线性相关的,所以时间复杂度接近 O(n)。
最坏时间复杂度:O(n²),当所有元素都被分配到同一个桶时,桶内排序可能退化到 O(n²)。
空间复杂度:O(n + k)。

我们来看一道例题

洛谷P1271

代码如下:

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;// 定义桶的数量
const int BUCKET_COUNT = 100; // 假设使用 100 个桶int main() {int n, m;// 从标准输入读取两个整数 n 和 mcin >> n >> m;// 创建一个二维向量,每个向量代表一个桶vector<vector<int>> buckets(BUCKET_COUNT);// 遍历 m 次,从标准输入读取每一个整数 xfor (int i = 0; i < m; i++) {int x;cin >> x;// 将 x 放入对应的桶中// 使用简单的比例公式计算 x 应该属于哪个桶int bucketIndex = (x * BUCKET_COUNT) / (n + 1); // 分桶逻辑buckets[bucketIndex].push_back(x);}// 对每个桶内的数据进行排序for (int i = 0; i < BUCKET_COUNT; i++) {sort(buckets[i].begin(), buckets[i].end());}// 合并所有桶,并输出排序后的结果for (int i = 0; i < BUCKET_COUNT; i++) {for (int j = 0; j < buckets[i].size(); j++) {cout << buckets[i][j] << ' ';}}return 0;
}

计数排序

计数排序(Counting Sort)是一种线性时间复杂度的排序算法是一种特殊的桶排序,适用于整数排序。它的基本思想是:通过统计每个元素出现的次数,进而直接确定它们在排序数组中的位置。

在这里插入图片描述

计数排序的特点:

适用于已知范围且数据分布相对集中的整数排序。
时间复杂度为 O(n + k),其中 n 是待排序的元素个数,k 是元素的最大值与最小值之间的差值。
计数排序是稳定排序,即相同元素在排序后仍保持其相对顺序。
计数排序适合于当排序的元素范围较小时使用,当数据范围很大时会消耗较多的空间。

计数排序的步骤:

1.找到数组中的最大值和最小值,确定数据范围。
2.创建一个计数数组,记录每个元素出现的次数。
3.根据计数数组中的累积和,确定每个元素在排序数组中的位置。
4.根据计数数组,将输入数组中的元素按序填入输出数组。

还是刚刚的那道题洛谷P1271

代码如下:

#include <iostream>
using namespace std;// 定义一个常量 N,表示数组的大小
const int N = 2e6 + 10;
// 声明一个大小为 N 的整型数组 a
int a[N];int main()
{int n, m;// 从标准输入读取两个整数 n 和 mcin >> n >> m;// 遍历 m 次,从标准输入读取每一个整数 xfor (int i = 1; i <= m; i++){int x;cin >> x;// 增加数组 a[x] 的计数a[x]++;}// 遍历 0 到 n 的所有整数for (int i = 0; i <= n; i++){// 对于数组 a[i] 中的每一个计数,输出整数 ifor (int j = 1; j <= a[i]; j++){cout << i << ' ';}}return 0;
}

桶排序和计算排序源码

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

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

相关文章

RuntimeError: Maximum Recursion Depth Exceeded - 递归深度超限的完美解决方案

RuntimeError: Maximum Recursion Depth Exceeded - 递归深度超限的完美解决方案 &#x1f6e0;️ RuntimeError: Maximum Recursion Depth Exceeded - 递归深度超限的完美解决方案摘要 &#x1f4c3;引言 ✨1. 什么是递归&#xff1f;&#x1f50d;1.1 递归的基本概念 &#x…

JavaScript可视化示例

JavaScript 可视化是指使用 JavaScript 编程语言来创建和操作图形、图表、动画等视觉元素的过程。以下是一些常见的 JavaScript 可视化库和工具&#xff0c;以及它们的主要特点&#xff1a; 1. D3.js 特点: D3.js&#xff08;Data-Driven Documents&#xff09;是一个非常强大…

思维商业篇(4)—产业上下游定

思维商业篇(4)—产业上下游定位(微笑曲线) 产业上下游定位&#xff0c;帮助我们去观察一个企业在产业上下游中处于一个什么样的生态位。 上游 处于产业链开始端&#xff0c;百川东到海&#xff0c;百川的的起始端就是上游&#xff0c;东到海的海就是下游。 处在上游的企业一…

嵌入式系统基础讲解

​ 大家好&#xff0c;我是程序员小羊&#xff01; 前言&#xff1a; 嵌入式系统是计算机科学与电子工程的交叉领域&#xff0c;广泛应用于消费电子、工业控制、汽车、医疗设备等多个行业。嵌入式系统设计涉及硬件和软件的协同开发&#xff0c;要求开发者掌握多方面的基础知识。…

Python学习——【4.4】数据容器(序列)的切片

文章目录 【4.4】数据容器&#xff08;序列&#xff09;的切片一、了解什么是序列二、掌握序列的切片操作 【4.4】数据容器&#xff08;序列&#xff09;的切片 一、了解什么是序列 序列是指&#xff1a;内容连续、有序&#xff0c;可使用下标索引的一类数据容器。 列表、元组…

基于单片机的粮仓环境检测系统设计

本设计主要由处理模块、温湿度检测模块、数据显示模块、声光报警模块和按钮的输入模块组成。采用了AT89C52作为主要的控制单元&#xff0c;利用DHT11温湿度传感器&#xff0c;对粮食仓库中的温度和湿度等展开检测&#xff0c;并在LCD1602液晶显示器中进行实时显示。同时&#x…

双向链表:实现、操作与分析【算法 17】

双向链表&#xff1a;实现、操作与分析 引言 双向链表&#xff08;Doubly Linked List&#xff09;是链表数据结构的一种重要形式&#xff0c;它允许节点从两个方向进行遍历。与单向链表相比&#xff0c;双向链表中的每个节点不仅包含指向下一个节点的指针&#xff08;或引用&…

iOS常见锁及应用(笔记版)

什么是锁&#xff1f; 在程序中&#xff0c;当多个任务&#xff08;或线程&#xff09;同时访问同一个资源时&#xff0c;比如多个操作同时修改一份数据&#xff0c;可能会导致数据不一致。这时候&#xff0c;我们需要“锁”来确保同一时间只有一个任务能够操作这个数据&#…

django项目——图片上传到阿里云OSS对象存储

文章目录 实现图片上传到阿里云OSS对象存储1. 创建阿里云OSS对象存储2. 查询获取接口访问key和秘钥3. 安装阿里云的SDK集成到项目中使用3.1 python直接操作oss23.2 django配置自定义文件存储上传文件到oss 实现图片上传到阿里云OSS对象存储 1. 创建阿里云OSS对象存储 开发文档…

顶点缓存对象(VBO)与顶点数组对象(VAO)

我们的顶点数组在CPU端的内存里是以数组的形式存在,想要GPU去绘制三角形,那么需要将这些数据传输给GPU。那这些数据在显存端是怎么存储的呢?VBO上场了,它代表GPU上的一段存储空间对象,表现为一个unsigned int类型的变量,GPU端内存对象的一个ID编号、地址、大小。一个VBO对…

Python爬虫之urllib模块详解

Python爬虫入门 此专栏为Python爬虫入门到进阶学习。 话不多说&#xff0c;直接开始吧。 urllib模块 Python中自带的一个基于爬虫的模块&#xff0c;其实这个模块都几乎没什么人用了&#xff0c;我就随便写写了。 - 作用&#xff1a;可以使用代码模拟浏览器发起请求。&…

基于python的文本聚类分析与可视化实现,使用kmeans聚类,手肘法分析

1、数据预处理 由于在数据分析之前数据集通常都存在数据重复、脏数据等问题&#xff0c;所以为了提高 数据分析结果的质量&#xff0c;在应用之前就必须对数据集进行数据预处理。数据预处理的方法通常有清洗、集成、转换、规约这四个方面&#xff0c;接下来详细介绍这对爬取…

leetcode第七题:字符反转

给你一个 32 位的有符号整数 x &#xff0c;返回将 x 中的数字部分反转后的结果。 如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] &#xff0c;就返回 0。 假设环境不允许存储 64 位整数&#xff08;有符号或无符号&#xff09;。 示例 1&#xff1a; 输入…

分布式安装LNMP

目录 搭建LNMP架构 安装mysql 1.上传mysql软件包&#xff0c;关闭防火墙和核心防护 2.安装环境依赖包&#xff0c;桌面安装可能有自带的数据库除 3.配置软件模块 4.编译及安装 5.创建mysql用户 6.修改mysql 配置文件 7.更改mysql安装目录和配置文件的属主属组 8.设置…

认识结构体

目录 一.结构体类型的声明 1.结构的声明 2.定义结构体变量 3.结构体变量初始化 4.结构体的特殊声明 二.结构体对齐(重点难点) 1.结构体对齐规则 2.结构体对齐练习 (一)简单结构体对齐 (二)嵌套结构体对齐 3.为什么存在内存对齐 4.修改默认对齐数 三.结构体传参 1…

Object类代码结构

Object Object是所有类的父类。 方法结构如下 一些不知道的方法 private static native void registerNatives(); * JNI机制 * 这里定义了一个 native 方法 registerNatives()&#xff0c;它没有方法体。 * native 关键字表示这个方法的实现是由本地代码 * &#xff08;通常…

【Pytorch】一文快速教你高效使用torch.no_grad()

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 博主简介 博主致力于嵌入式、Python、人工智能、C/C领域和各种前沿技术的优质博客分享&#xff0c;用最优质的内容带来最舒适的…

BERT的代码实现

目录 1.BERT的理论 2.代码实现 2.1构建输入数据格式 2.2定义BERT编码器的类 2.3BERT的两个任务 2.3.1任务一&#xff1a;Masked Language Modeling MLM掩蔽语言模型任务 2.3.2 任务二&#xff1a;next sentence prediction 3.整合代码 4.知识点个人理解 1.BERT的理论 B…

Linux 静态库与动态库的制作与使用

在Linux中&#xff0c;库library是一组函数和资源的集合&#xff0c;他们可以被不同的程序共享和使用&#xff0c;库的主要目的是代码重用&#xff0c;减少内存占用&#xff0c;并简化程序的维护。 Linux操作系统支持的函数库分为&#xff1a;静态库和动态库。 静态库&#xf…

【线程池】Tomcat线程池

版本&#xff1a;tomcat-embed-core-10.1.8.jar 前言 最近面试被问到 Tomcat 线程池&#xff0c;因为之前只看过 JDK 线程池&#xff0c;没啥头绪。在微服务横行的今天&#xff0c;确实还是有必要研究研究 Tomcat 的线程池 Tomcat 线程池和 JDK 线程池最大的不同就是它先把最…