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

embedded/2024/9/24 11:08:49/

桶排序

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

相关文章

基于vue框架的宠物托管系统设计与实现is203(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能&#xff1a;用户,宠物种类,商家,咨询商家,用户宠物,宠物托管,宠物状况,宠物用品,用品分类,商家公告,结束托管,账单信息,延长托管 开题报告内容 基于Vue框架的宠物托管系统设计与实现开题报告 一、引言 随着现代生活节奏的加快&#xff0c;越来越…

3. 什么是连接池?为什么使用数据库连接池?

连接池&#xff08;Connection Pool&#xff09; 是一种数据库连接管理技术&#xff0c;用于在应用程序和数据库之间管理数据库连接。连接池通过预先创建和维护一定数量的数据库连接&#xff0c;将这些连接放入一个“池”中&#xff0c;供应用程序重复使用。这种方法避免了频繁…

uniapp map设置高度为100%后,会拉伸父容器的高度

推荐学习文档 golang应用级os框架&#xff0c;欢迎stargolang应用级os框架使用案例&#xff0c;欢迎star案例&#xff1a;基于golang开发的一款超有个性的旅游计划app经历golang实战大纲golang优秀开发常用开源库汇总想学习更多golang知识&#xff0c;这里有免费的golang学习笔…

数模方法论-无约束问题求解

一、基本概念 无约束问题在数学建模中是指优化过程中没有任何限制条件的情况。这种问题旨在寻找一个决策变量集合&#xff0c;使得某个目标函数&#xff08;如成本、效益或其他需要优化的量&#xff09;达到最大或最小值。具体来说&#xff0c;无约束问题通常可以表示为&#x…

Centos 7 搭建Samba

笔记&#xff1a; 环境&#xff1a;VMware Centos 7&#xff08;网络请选择桥接模式&#xff0c;不要用NAT&#xff09; 遇到一个问题就是yum 安装404&#xff0c;解决办法在下面&#xff08;没有遇到可以无视这句话&#xff09; # 安装Samba软件 yum -y install samba# 创建…

深度学习:(五)初识神经网络

&#xff08;一&#xff09;神经网络的层数 除去输入层&#xff0c;但包括输出层&#xff0c;每一层都有自己的参数。 输入层称为第零层。 &#xff08;二&#xff09;最简单的神经网络&#xff08;逻辑回归&#xff09; 下图中的小圆圈&#xff0c;代表了一种运算。且一个小…

如何从格式化的笔记本电脑或台式机中恢复照片

您想学习如何从已格式化的笔记本电脑或台式机中恢复已删除的照片吗&#xff1f;这篇文章解释了如何使用最佳格式的照片恢复软件来做到这一点。您可以通过简单的步骤格式化计算机后恢复已删除的图像。 将照片保存在笔记本电脑或 PC 硬盘上是很常见的。与相机存储卡和 USB 闪存驱…

【玩转贪心算法专题】763. 划分字母区间【中等】

【玩转贪心算法专题】763. 划分字母区间【中等】 1、力扣链接 https://leetcode.cn/problems/partition-labels/description/ 2、题目描述 给你一个字符串 s 。我们要把这个字符串划分为尽可能多的片段&#xff0c;同一字母最多出现在一个片段中。 注意&#xff0c;划分结…