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

server/2024/9/23 20:49:33/

桶排序

桶排序是一种基于分配的算法>排序算法,特别适合用来排序均匀分布的数据。它的基本思想是将输入的数据分到有限数量的桶里,然后对每个桶内的数据分别进行排序,最后再将各个桶内的数据合并得到最终的排序结果。(通常用于浮点数,因为浮点数是有范围的比如说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.ppmy.cn/server/120985.html

相关文章

pikachu XXE(XML外部实体注入)通关

靶场&#xff1a;pikachu 环境: 系统&#xff1a;Windows10 服务器&#xff1a;PHPstudy2018 靶场&#xff1a;pikachu 关卡提示说&#xff1a;这是一个接收xml数据的api 常用的Payload 回显 <?xml version"1.0"?> <!DOCTYPE foo [ <!ENTITY …

三范式,面试重点

三范式都是拿来解决数据冗余的问题 第一范式&#xff1a; 表必须有主键&#xff0c;它确保表中的每一列都是原子性的&#xff0c; 第二范式 定义&#xff1a;数据库表必须满足第一范式&#xff0c;且表中的非主属性完全依赖于主键。非主属性是指除了主键之外的其他属性。完…

WPF 自定义路由事件

WPF 自定义路由事件 一、自定义路由事件步骤 ① 注册路由事件    ② 为路由事件添加 CLR 事件包装器    ③ 创建可激发路由事件的方法 二、注册路由事件 EventManager.RegisterRoutedEvent(String, RoutingStrategy, Type, Type)     作用&#xff1a;将新的路由事件…

关于ollama 在mac的部署问题

安装 官网链接 直接按需求下载即可 默认模型下载地址 macOS: ~/.ollama/models Linux: /usr/share/ollama/.ollama/models Windows: C:\Users<username>.ollama\models 根据需要的平台设置相应的环境变量&#xff1a; OLLAMA_MODELS 如Mac 设置 &#xff5e;/.zshrc …

电脑网络怎么弄动态ip :步骤详解与优势探讨

在当今的数字化时代&#xff0c;网络连接已成为我们日常生活和工作中不可或缺的一部分。对于大多数用户而言&#xff0c;动态IP地址是一种便捷且常用的网络配置方式&#xff0c;它允许设备在每次连接到网络时自动获取一个新的IP地址。这种设置不仅简化了网络管理&#xff0c;还…

屋顶气膜网球馆:智慧城市资源利用之道—轻空间

随着城市空间日益紧张&#xff0c;屋顶气膜网球馆为稀缺的城市资源提供了创新的解决方案。通过最大化利用城市现有的屋顶空间&#xff0c;这种场馆模式为投资者和运动爱好者创造了双赢局面。 快速搭建&#xff0c;节省工程成本 屋顶气膜网球馆以其轻质的气膜材料和模块化设计&a…

鸿蒙Harmony应用开发,数据驾驶舱登录页面的实现

鸿蒙Harmony应用开发&#xff0c;数据驾驶舱登录页面的实现 ​ 首先我们有个Splash 过渡页面来判断当前是用户是否登录&#xff0c;我们先从preferences中获取token是否存在。如果不存在直接跳转登录即可&#xff0c;如果存在的情况我们再去获取下用户的信息看看token是否过期…

Qwen 2.5:阿里巴巴集团的新一代大型语言模型

Qwen 2.5&#xff1a;阿里巴巴集团的新一代大型语言模型 摘要&#xff1a; 在人工智能领域&#xff0c;大型语言模型&#xff08;LLMs&#xff09;的发展日新月异&#xff0c;它们在自然语言处理&#xff08;NLP&#xff09;和多模态任务中扮演着越来越重要的角色。阿里巴巴集…