【基数排序】 C++高效实现

news2025/2/25 8:31:08

题目描述

给定你一个长度为 n n n 的整数数列。

请你使用快速排序对这个数列按照从小到大进行排序。

并将排好序的数列按顺序输出。

输入格式

输入共两行,第一行包含整数 n n n

第二行包含 n n n 个整数(所有整数均在 1 ∼ 1 0 9 1 \sim 10^9 1109 范围内),表示整个数列。

输出格式

输出共一行,包含 n n n 个整数,表示排好序的数列。

数据范围

1 ≤ n ≤ 100000 1 \le n \le 100000 1n100000

输入样例:

5
3 1 2 4 5

输出样例:

1 2 3 4 5

算法

基数排序

网上搜索基数排序C++,大多都是非常低效的实现,于是自己动手实现一个速度较快的版本。

基数排序原理:一图胜千言
在这里插入图片描述

10 10 10进制下,每次取个位和十位需要用除法和模运算,为了规避除法和模运算,采用 16 16 16进制收集排序。实际测试比快速排序略快(数据量 1 e 5 1e5 1e5较小,出到 1 e 7 1e7 1e7差距会很大)。

在这里插入图片描述


时间复杂度 Θ ( d n ) \Theta (dn) Θ(dn)

最多扫描 d = l o g 16 S d=log_{16}S d=log16S轮, S = max ⁡ { i ∈ [ 1 , N ] ∣ a [ i ] } S=\max\{i\in \left[ 1,N \right] \vert a[i]\} S=max{i[1,N]a[i]},每轮收集 n n n个元素,故 Θ ( d n ) \Theta (dn) Θ(dn)

C++ 代码

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;
const int N = 1e5 + 10;
int a[N], n, k, ma, l = 16;
int buck[16][N];
int cnt[16];

void radix_sort(int k){
    int mod = 0;
    int t, c;
    for(int r = 0; r < k; ++ r){
        memset(cnt, 0, sizeof cnt);
        for(int i = 0; i < n; ++ i){
            t = (a[i] >> (mod * 4)) & 15;
            buck[t][cnt[t] ++ ] = a[i];
        }
        mod ++;
        for(int i = 0, c = 0; i < l; ++ i)
            for(int j = 0; j < cnt[i]; ++ j)
                a[c ++] = buck[i][j];
    }
    
}

int main(){
    scanf("%d", &n);
    for(int i = 0; i < n; ++ i){
        scanf("%d", &a[i]);
        ma = max(ma, a[i]);
    }
    
    while(ma > 0){
        ma /= l;
        k ++;
    }
    
    radix_sort(k);
    
    for(int i = 0; i < n; ++ i) printf("%d ", a[i]);
    
    
}

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

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

相关文章

Android架构演进 · 设计模式· 为什么建议你一定要学透设计模式?

“ 【小木箱成长营】设计模式系列文章(排期中)&#xff1a; Android 架构演进 设计模式 Android 常见的 4 种创建型设计模式(上) Android 架构演进 设计模式 Android 常见的 4 种创建型设计模式(下) Android 架构演进 设计模式 Android 常见的 6 种结构型设计模式(上) An…

vue2 中组件的生命周期

目录 一、组件的生命周期 1、什么是组件的生命周期&#xff1f; 2、生命周期的阶段划分&#xff1a; &#xff08;1&#xff09;创建阶段&#xff1a;beforeCreate、created、beforeMount、mounted ​&#xff08;2&#xff09;运行阶段&#xff1a;beforeUpdate、updatev…

【顺序表】数据结构,java代码实现

前言&#xff1a; 大家好&#xff0c;我是良辰丫&#x1f353;&#x1f353;&#x1f353;&#xff0c;顺序表和数组有什么区别呢&#xff0c;我们带着这个疑问去接触顺序表&#xff0c;学习顺序表相关知识。&#x1f680;&#x1f680;&#x1f680; &#x1f9d1;个人主页&am…

商城系统春节氛围营造

春节将至&#xff0c;无论是线上还是线下&#xff0c;都在紧锣密鼓的进行春节营销&#xff0c;线下商家可以通过布置店铺&#xff0c;来营造节日氛围&#xff0c;那对于线上商城来说&#xff0c;又能从哪些方面进行氛围营造呢&#xff1f;今天&#xff0c;我们就以CRMEB Pro版系…

Spring Boot Actuator详解与深入应用(一):Actuator 1.x

《Spring Boot Actuator详解与深入应用》预计包括三篇&#xff0c;第一篇重点讲Spring Boot Actuator 1.x的应用与定制端点&#xff1b;第二篇将会对比Spring Boot Actuator 2.x 与1.x的区别&#xff0c;以及应用和定制2.x的端点&#xff1b;第三篇将会介绍Actuator metric指标…

AWVS扫描报告分析

系列文章 AWVS安装与激活 AWVS扫描Web应用程序 扫描报告分析 生成报告 1.选则我们已经扫描好的网站&#xff0c;点击它 2.点击后&#xff0c;右上角选择生成报告 3.选择生成报告的类型 4.点击生成报告 如下我们分别选择了三种规格生成了三份不同类型的报告 5.点击HTML&…

Vivado

Vivado设计套件&#xff0c;是Xilinx公司最新的为其产品定制的集成开发环境&#xff0c;支持Block Design、Verilog、VHDL等多种设计输入方式&#xff0c;内嵌综合器以及仿真器&#xff0c;可以完成从设计输入、综合适配、仿真到下载的完整FPGA设计流程。 Vivado集成了HLS&…

与机器人chatGPT聊聊软件测试的热门话题

之前我和chatGPT有过一次对话&#xff0c; 那只是问一些有趣的、时髦的大众话题。上周末在家&#xff0c;想考一考chatGPT的软件测试专业水平&#xff0c;确定它是否算得上一名测试专家&#xff1f;通过一系列有难度的提问&#xff0c;感觉有时它答的精妙与全面&#xff0c;但有…

SAP ABAP——SAP包(一)【包概要简述及创建】

&#x1f482;作者简介&#xff1a; THUNDER王&#xff0c;一名热爱财税和SAP ABAP编程以及热爱分享的博主。目前于江西师范大学会计学专业大二本科在读&#xff0c;同时任汉硕云&#xff08;广东&#xff09;科技有限公司ABAP开发顾问。在学习工作中&#xff0c;我通常使用偏后…

jsp 实验室管理系统Myeclipse开发mysql数据库web结构jsp编程计算机网页项目

一、源码特点 jsp 实验室管理系统 是一套完善的web设计系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql&#xff0c;使用…

Node 异步I/O 实现

Node 异步I/O 实现 文章目录Node 异步I/O 实现理想的非阻塞异步 I/O现实的异步I/O实现方案重磅来了 Node 的异步 I/O的实现整个异步 I/O 的过程Node 实现异步 I/O 的总结PS&#xff1a;&#x1f330;理想的非阻塞异步 I/O 但是现实是骨感的&#xff0c;现实的异步I/O实现方案有…

Apache Doris 系列: 基础篇-使用BitMap函数精准去重(1)

1. 简述 精准去重的常用方式是使用SQL函数COUNT(DISTINCT)&#xff0c;这种方法最简单&#xff0c;但是要求所有数据都汇聚在一个节点上计算&#xff0c;在数据量大的情况下&#xff0c;需要等待比较常的时间。 例如一个6000000行数据的表&#xff0c;执行以下SQL&#xff0c;…

模板技术详解

目录 一、概念介绍 二、函数模板 2.1 概念 2.2 函数模板格式 2.3 函数模板原理 2.4 函数模板实例化 2.5 函数模板的匹配原则 三、类模板 3.1 类模板格式 3.2 类模板实例化 四、非类型模板参数 五、模板特化 5.1 概念 5.2 函数模板特化 5.3 类模板特化 六、模板…

如何使用mybatis处理数据库关系中的一对多关系呢?

测试环境的搭建&#xff1a; 本篇文章的测试环境搭建和上篇文章基本相似&#xff0c;这里在上篇文章传送门测试环境的基础上进行对比和修改&#xff01; 上篇文章所提到的多对一是多个学生对应一个老师&#xff0c;是在学生的角度去获取老师的信息&#xff0c;而本篇文章的一…

关于MySQL中的数据类型

一、常见的数据类型有&#xff1a; varchar&#xff08;最长255&#xff09;&#xff1a;【每个长度可以保存一个英文字符或一个汉字】 可变长度字符串 比较智能 节省空间 会根据实际的数据长度动态分配空间 优点&#xff1a;节省空间 缺点&#xff1a;需要动态分配空间&am…

phy-MDC时钟修改

问题分析:我们这边更换一种电平转换芯片&#xff0c;还是没调通。可能一个原因是这个芯片在开漏模式下速速最高到2M有关&#xff0c;您那边能帮忙协调一下&#xff0c;把内核PHY的MDC时钟改为2M以下&#xff0c;另把PHY的复位时间由现在的13MS左右调整到30MS左右我们试一下 在…

数据库知识学习

关系型数据库学习 提示&#xff1a;这里可以添加系列文章的所有文章的目录&#xff0c;目录需要自己手动添加 提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录关系型数据库学习一 数据库介绍1 相关定义数据&#xf…

基于卷积神经网络识别金融票据中的文字信息(计算机毕设完整代码可直接运行)

结果展示&#xff1a;用户首先通过”浏览文件”按钮选择扫描获得的金融票据图片. 程序就能够提取出金融票据图片中的日期, 金额等信息和图片路径信息显示在屏幕上. 程序还设置了帮助按键,使用者通过帮助按钮获得帮助.由图可见票据的日期为 19 年 06 月 22 日(062219), 程序可以…

CMMI之需求管理

需求管理&#xff08;Requirement Management, RM&#xff09;的目的在客户与开发方之间建立对需求的共同理解&#xff0c;维护需求与其他工作成果的一致性&#xff0c;并控制需求的变更。需求管理过程域是SPP模型的重要组成部分。本规范阐述了需求管理过程域的三个主要规程&am…

低代码平台是技术开发的未来主流吗?

2022年9月27日16:49:21 这个事情我想了很久&#xff0c;最终的结论是&#xff1a;低代码平台只会一些领域平台的部分功能模块的标配&#xff0c;不会成为技术主流。 部分代表性例子&#xff1a; 1&#xff0c;低代码平台很早就有了&#xff0c;比如Visual Basic 6.0 ,delphi这些…