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

news2024/9/23 10:15:52

桶排序

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

    // 创建一个二维向量,每个向量代表一个桶
    vector<vector<int>> buckets(BUCKET_COUNT);

    // 遍历 m 次,从标准输入读取每一个整数 x
    for (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 和 m
    cin >> n >> m;

    // 遍历 m 次,从标准输入读取每一个整数 x
    for (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] 中的每一个计数,输出整数 i
        for (int j = 1; j <= a[i]; j++)
        {
            cout << i << ' ';
        }
    }

    return 0;
}

桶排序和计算排序源码

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

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

相关文章

LLM大模型训练/推理的显卡内存需求计算

无论你是从头开始训练 LLM、对其进行微调还是部署现有模型&#xff0c;选择合适的 GPU 对成本和效率都至关重要。在这篇博客中&#xff0c;我们将详细介绍使用单个和多个 GPU 以及不同的优化器和批处理大小进行 LLM 训练和推理时 GPU 要求的所有信息。 计算机处理器由多个决定…

SM2无证书及隐式证书公钥机制签名和加密过程详解(一)

前面介绍SM2无证书及隐式证书公钥机制下用户公私密钥对的Python实现&#xff08;具体参看SM2隐式证书用户公私钥生成python代码实现_sm2 python 密钥生成-CSDN博客&#xff09;&#xff0c;可以看到需由用户和KGC&#xff08;可信密钥生成中心&#xff09;共同参与才能计算得到…

小程序-基础知识1

Mustache语法 小程序和vue一样提供了插值语法 但是小程序不能调用方法{{xxxx()}} hidden属性 hidden是所有组件都默认拥有的属性&#xff0c; hidden与wx:if的区别&#xff1a; wx:if是控制组件是否渲染,hidden控制显示或隐藏是通过添加hidden属性。 wx:for 除了可以遍历…

服务器配置虚拟环境及离线安装python

本篇文章基于已经装好conda环境进行哈&#xff0c;不会安装conda可参考服务器离线安装anaconda-CSDN博客 1.打印现有虚拟环境列表 conda env list&#xff0c;可以看见我现在有base、ai、py38三个环境 2.删除指定虚拟环境 conda remove -n py38 --all&#xff0c;回车后输入ye…

LeetCode 面试经典150题 190.颠倒二进制位

复习知识&#xff1a;正数的原码、反码、补码相同&#xff0c;负数的反码在其原码的基础上, 符号位不变&#xff0c;其余各个位取反&#xff0c;负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后1 (即在反码的基础上1)。 题目&#xff1a;颠倒给定的 32 位无符号…

全国及分(31个)省全社会就业人数(1978-2022年)

分省就业人数分析 经济发达省份&#xff1a;如广东、江苏、浙江等省份的就业人数较高&#xff0c;这与它们的经济发展水平和产业结构密切相关。欠发达省份&#xff1a;虽然就业人数相对较低&#xff0c;但也呈现出增长态势&#xff0c;显示了国家在区域协调发展上的成效。 从…

软考高级:数据库事务状态区分:活动、部分提交、提交、失败、中止 AI 解读

讲解 数据库事务状态的区分可以用来表示事务在不同阶段的状态。事务&#xff08;Transaction&#xff09;是数据库中的一组操作&#xff0c;要么全部成功&#xff0c;要么全部失败。这些状态可以帮助我们理解事务从开始到结束的整个生命周期。 生活化例子 假设你去餐厅点餐&…

AI资深导师指导-ChatGPT深度科研工作应用、论文撰写、数据分析及机器学习与AI绘图

2022年11月30日&#xff0c;可能将成为一个改变人类历史的日子——美国人工智能开发机构OpenAI推出了聊天机器人ChatGPT3.5&#xff0c;将人工智能的发展推向了一个新的高度。2023年4月&#xff0c;更强版本的ChatGPT4.0上线&#xff0c;文本、语音、图像等多模态交互方式使其在…

操作系统week3

操作系统学习 三.内存管理 16.内存映射文件 传统的文件访问方式&#xff1a; open系统调用–打开文件seek系统调用–将读写指针移到某个位置read系统调用–从读写指针所指位置读入若干数据write系统调用–将内存中的指定数据&#xff0c;写回磁盘 内存映射文件的访问方式&…

2.pytest框架实现一些前后置(固件,夹具)的处理,断言和allure-pytest插件生成allure测试报告

一、setup/teardowm,setup_class/teardown_class&#xff08;所有&#xff09; 为什么需要这些功能&#xff1f; 比如&#xff1a;web自动化执行用例之前&#xff0c;请问需要打开浏览器吗&#xff1f;用例执行后需要关闭浏览器吗&#xff1f; 前置后置 二、使用pytest.fixture…

KamaCoder 103. 水流问题

题目要求 N*M的矩阵&#xff0c;数值代表位置的相对高度。矩阵模拟了一个地形&#xff0c;当雨水落上时&#xff0c;会根据地形倾斜向低处流动。但是只能从较高或等高的地点流向较低或等高并且相邻的地点&#xff0c;我们的目标是确定那些单元格&#xff0c;从这些单元格出发的…

[数据结构与算法·C++] 笔记 2.1 线性表

线性结构 概念 二元组 B ( K , R ) B(K,R) B(K,R) K a 0 , a 1 , . . . , a n − 1 K{a_0,a_1,...,a_{n-1}} Ka0​,a1​,...,an−1​ ( R r R{r} Rr) 有一个唯一的开始结点&#xff0c;它没有前驱&#xff0c;有一个唯一的直接后继一个唯一的终止结点&#xff0c;它有一个…

Diffusion Models/Score-based Generative Models背后的深度学习原理(7):估计配分函数

Diffusion Models专栏文章汇总&#xff1a;入门与实战 前言&#xff1a;有不少订阅我专栏的读者问diffusion models很深奥读不懂&#xff0c;需要先看一些什么知识打下基础&#xff1f;虽然diffusion models是一个非常前沿的工作&#xff0c;但肯定不是凭空产生的&#xff0c;背…

【水文】LLM 成文测试|探索嵌入式硬件编程的奥秘:入门基础知识的全面解析

这次用的是智谱清言的&#xff0c;文字质量比百度的高一些。 但是在按要求改写的方面还是需要给出太过明确的指令&#xff0c;麻烦。 探索嵌入式硬件编程的奥秘&#xff1a;入门基础知识的全面解析 嵌入式硬件作为现代科技的核心&#xff0c;广泛应用于各种设备和系统中。对于…

【OSS安全最佳实践】对OSS内身份证图片中身份证号进行脱敏

为确保存储在私有OSS Bucket特定文件夹中包含中国内地身份证信息的PNG、JPG、JPEG、BMP或WEBP格式图片&#xff0c;在与其他用户共享时身份证信息不被泄露&#xff0c;可使用数据安全中心 DSC&#xff08;Data Security Center&#xff09;的图片脱敏功能。DSC目前仅支持对身份…

计算机前沿技术-人工智能算法-大语言模型-最新论文阅读-2024-09-22

计算机前沿技术-人工智能算法-大语言模型-最新论文阅读-2024-09-22 引言: 全球最热销的国产游戏-《黑神话: 悟空》不仅给世界各地玩家们带来愉悦&#xff0c;而且对计算机人工智能研究也带来新的思考。在本期的论文速读中&#xff0c;我们带来一篇关于视觉语言模型&#xff0…

【C++高阶】深入理解C++ I/O流:标准库中的隐藏宝石

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ ⏩收录专栏⏪&#xff1a;C “ 登神长阶 ” &#x1f921;往期回顾&#x1f921;&#xff1a;C 特殊类 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀ C IO流 &#x1f4d2;1. C语言的输入…

Linux中的动静态库

目录 前言 1.库的文件名 2.库的制作 对于动态库&#xff1a; 对于静态库&#xff1a; 3.库文件的查找 4.库的加载与使用 对于动态库&#xff1a; 对于静态库&#xff1a; 可执行程序分段&#xff1a; 程序的编址于动态库&#xff1a; 总结 前言 在刚开始学习C语言…

NASA:ASTER L1A 重建未处理仪器数据 V003

ASTER L1A 重建未处理仪器数据 V003 简介 先进星载热发射和反射辐射计&#xff08;ASTER&#xff09;1A 级&#xff08;AST_L1A&#xff09;包含重建的仪器数字编号&#xff08;DN&#xff09;&#xff0c;这些数字编号来自所获取的望远镜遥测数据流&#xff1a; 可见光和近红…

综合题第一题(地址表的填写)

题目 第一题的形式大概就是这样的&#xff0c;通常IP地址和子网掩码会给我们。 地址类别 补充知识 IP地址&#xff08;Internet Protocol Address&#xff09;是分配给网络中设备的数字标签&#xff0c;用于标识设备在网络中的位置。IP地址分为IPv4和IPv6两种版本&#xff0…