PTA 7-12 排序

news2025/3/17 10:14:41

题目描述

给定 n 个(长整型范围内的)整数,要求输出从小到大排序后的结果。

本题旨在测试各种不同的排序算法在各种数据情况下的表现。各组测试数据特点如下:

  • 数据1:只有1个元素;
  • 数据2:11个不相同的整数,测试基本正确性;
  • 数据3:103个随机整数;
  • 数据4:104个随机整数;
  • 数据5:105个随机整数;
  • 数据6:105个顺序整数;
  • 数据7:105个逆序整数;
  • 数据8:105个基本有序的整数;
  • 数据9:105个随机正整数,每个数字不超过1000。

    输入格式:

    输入第一行给出正整数 n(≤105),随后一行给出 n 个(长整型范围内的)整数,其间以空格分隔。

    输出格式:

    在一行中输出从小到大排序后的结果,数字间以 1 个空格分隔,行末不得有多余空格。

    输入样例:

    11
    4 981 10 -17 0 -20 29 50 8 43 -5
    

    输出样例:

    -20 -17 -5 0 4 8 10 29 43 50 981

题目分析 

题目是说给n个长整型范围内的整数,然后输出从小到大排序后的结果。看起来这个题目的测试数据有不同的情况,包括不同的数据量和不同特点的数据,比如有序、逆序、重复等等。所以我要选择一个高效的排序算法来处理这些情况。

首先,考虑时间复杂度。因为n可以达到1e5,也就是十万级别。这时候像冒泡排序、插入排序这样的O(n²)算法肯定是不行的,时间会超限。那应该选择更高效的算法,比如快速排序、归并排序或者堆排序,这些的平均时间复杂度是O(n log n)。或者还可以用C++标准库里的sort函数,这个函数通常是经过高度优化的,应该能处理各种情况。

然后,题目里的各种测试数据需要注意。比如数据6是顺序的,数据7是逆序的,数据8是基本有序的。这时候如果使用普通的快速排序,在已经有序的情况下可能会退化成O(n²)的时间复杂度。所以在这种情况下,可能需要选择一种优化的快速排序,比如三数取中或者随机化选择枢轴,或者改用归并排序。不过C++的sort函数在实现时应该已经考虑到了这些情况,比如使用introsort,结合了快速排序和堆排序,来避免最坏情况。所以可能直接使用sort函数是可行的。

那这样的话,用C++的sort函数应该可以应对所有的测试点。接下来需要处理输入输出的问题。

输入的时候,n的值可能很大,比如1e5,这时候如果用cin读取的话可能会比较慢,尤其是当输入量大的时候。为了提高输入效率,可以考虑使用更快的输入方法,比如用scanf或者用ios::sync_with_stdio(false)来关闭同步,加速cin的读取速度。

另外,输入的整数可能有负数,所以读取的时候需要注意处理符号。输出的时候要确保行末没有多余的空格,所以可能需要先输出第一个元素,然后后面的元素前面加空格。

那具体来说,步骤如下:

1. 读取n的值。

2. 读取n个整数,存储到一个数组中。

3. 对这个数组进行排序。

4. 输出排序后的结果,每个数之间用空格分隔,行末不能有空格。

关于输入的方法,例如:

当n是1e5的时候,用cin可能会比较慢,特别是当默认情况下C++的cin和stdio是同步的。所以可以取消同步,加快速度。通常的做法是在main函数开头添加:

ios::sync_with_stdio(false);

cin.tie(nullptr);

这样可以提高cin的读取速度。不过需要注意的是,一旦这样做了,就不能再混用C的输入函数如scanf等,否则会出现问题。

然后,读取数组的时候,可以用vector<int>来存储,或者用动态数组。例如:

vector<long long> arr(n);

for (int i=0; i<n; i++) {

cin >> arr[i];

}

或者用数组的话,可能更高效,但vector更方便,特别是当n很大的时候,动态分配内存可能更灵活。

然后排序的时候直接调用sort函数:

sort(arr.begin(), arr.end());

然后输出的时候需要注意格式。比如第一个元素单独输出,后面的元素前面加一个空格。或者遍历数组,每个元素后面加空格,但最后一个元素不加。例如:

for (int i=0; i<n; i++) {

if (i>0) cout << " ";

cout << arr[i];

}

cout << endl;

这样处理的话,无论n是0还是其他情况都不会有问题。不过题目中n>=1吗?看题目描述,输入样例中的n是11,所以可能n>=1。所以不需要处理n为0的情况。

接下来,要考虑数据范围的问题。题目中的整数是长整型范围内,所以应该用long long类型存储,而不是int。因为比如输入可能有超过int范围的数值。例如,在C++中,int的范围通常是-2^31到2^31-1,而long long的范围更大。所以必须使用long long类型。

所以,数组应该定义为vector<long long>。

那综合以上分析,代码的大体结构应该是:

#include <iostream>

#include <vector>

#include <algorithm>

using namespace std;

int main() {

ios::sync_with_stdio(false);

cin.tie(nullptr);

int n;

cin >> n;

vector<long long> arr(n);

for (int i=0; i<n; i++) {

cin >> arr[i];

}

sort(arr.begin(), arr.end());

for (int i=0; i<n; i++) {

if (i != 0) {

cout << " ";

}

cout << arr[i];

}

cout << endl;

return 0;

}

这样应该就可以解决问题了。但需要考虑特殊情况,比如当n=0的时候怎么办?不过题目里给出的输入样例中的n是11,而且题目中输入的n是正整数,所以n>=1。所以代码中不需要处理n=0的情况。

另外,关于数据量较大的测试点,比如数据5到数据9都是1e5个元素,这时候输入输出的效率就变得非常重要。使用上述的优化方法应该可以满足时间要求。比如,关闭同步后的cin比默认情况下更快,而用vector存储数据不会有问题,sort的时间复杂度是O(n log n),对于1e5来说,这个时间应该在允许范围内。

总结,这道题的正确做法是使用快速输入输出优化,读取所有数据到vector中,然后调用标准库的sort函数进行排序,然后按格式输出。

代码实现

#include <iostream>
#include <vector>
#include <algorithm>  // 包含sort函数

using namespace std;

int main() {
    // 关闭同步,加速输入输出
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int n;
    cin >> n;

    vector<long long> arr(n);  // 存储长整型数据
    for (int i = 0; i < n; ++i) {
        cin >> arr[i];
    }

    // 使用标准库的sort函数进行排序,默认升序
    sort(arr.begin(), arr.end());

    // 输出结果,控制格式
    for (int i = 0; i < n; ++i) {
        if (i != 0) {
            cout << " ";
        }
        cout << arr[i];
    }
    cout << endl;

    return 0;
}

代码解释

  1. 输入输出优化

    • ios::sync_with_stdio(false); 和 cin.tie(nullptr); 用于关闭C++标准流与C标准流的同步,加快输入输出速度。

  2. 读取输入

    • 使用vector<long long>存储输入的整数,确保能够处理长整型范围内的数值。

    • 循环读取n个整数到数组中。

  3. 排序处理

    • 使用sort(arr.begin(), arr.end());对数组进行升序排序。该函数在C++标准库中实现高效,适用于各种数据分布。

  4. 输出结果

    • 遍历排序后的数组,按格式输出每个元素。第一个元素直接输出,后续每个元素前添加一个空格,确保行末无多余空格。

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

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

相关文章

uniapp 实现的步进指示器组件

采用 uniapp 实现的一款步进指示器组件&#xff0c;展示业务步骤进度等内容&#xff0c;对外提供“前进”、“后退”方法&#xff0c;让用户可高度自定义所需交互&#xff0c;适配 web、H5、微信小程序&#xff08;其他平台小程序未测试过&#xff0c;可自行尝试&#xff09; 可…

大模型-提示词调优

什么是提示词 提示词&#xff08;Prompt&#xff09;在大模型应用中扮演着关键角色&#xff0c;它是用户输入给模型的一段文本指令 。简单来说&#xff0c;就是我们向大模型提出问题、请求或描述任务时所使用的文字内容。例如&#xff0c;当我们想让模型写一篇关于春天的散文&a…

继承知识点—详细

一&#xff1a;普通写法 package extend_;public class Extends01 {public static void main(String[] args) {Pubil pubil new Pubil();pubil.name"小明";pubil.age18;pubil.testing();pubil.setScore(60);pubil.showInfo();System.out.println("-----------…

设备管理VTY(Telnet、SSH)

实验目的&#xff1a;物理机远程VTY通过telnet协议登录AR1,ssh协议登录AR2和sw 注意配置Cloud1&#xff1a; 注意&#xff01;&#xff01;博主的物理机VMnet8--IP&#xff1a;192.168.160.1&#xff0c;所以AR1路由0/0/0端口才添加IP&#xff1a;192.168.160.3&#xff0c;每个…

Linux 中 Git 使用指南:从零开始掌握版本控制

目录 1. 什么是 Git&#xff1f; Git 的核心功能&#xff1a; 2. Git 的安装 Ubuntu/Debian 系统&#xff1a; 验证安装&#xff1a; 3.gitee库 4. Git 的首次配置 配置用户名和邮箱&#xff1a; 查看配置&#xff1a; 5. Git 的基本使用 初始化仓库 添加文件到暂存区…

CSS -属性值的计算过程

目录 一、抛出两个问题1.如果我们学过优先级关系&#xff0c;那么请思考如下样式为何会生效2.如果我们学习过继承&#xff0c;那么可以知道color是可以被子元素继承使用的&#xff0c;那么请思考下述情景为何不生效 二、属性值计算过程1.确定声明值2.层叠冲突3.使用继承4.使用默…

百度贴吧IP和ID是什么意思?怎么查看

在百度贴吧这一充满活力的网络社区中&#xff0c;IP和ID是两个频繁出现的概念。它们各自承载着不同的意义和作用&#xff0c;对于贴吧用户而言&#xff0c;了解这两个概念有助于更好地参与社区互动、保护个人隐私以及维护社区秩序。本文将详细解析百度贴吧中IP和ID的含义&#…

SpiderX:专为前端JS加密绕过设计的自动化工具

SpiderX 一、工具概述 SpiderX是一款专为解决前端JS加密问题而设计的自动化绕过工具。在网络安全领域&#xff0c;随着前端加密技术的普及&#xff0c;传统的爬虫和自动化测试工具在面对复杂的JS加密时显得力不从心。SpiderX应运而生&#xff0c;旨在通过自动化手段高效绕过前…

基于银河麒麟系统ARM架构安装达梦数据库并配置主从模式

达梦数据库简要概述 达梦数据库&#xff08;DM Database&#xff09;是一款由武汉达梦公司开发的关系型数据库管理系统&#xff0c;支持多种高可用性和数据同步方案。在主从模式&#xff08;也称为 Master-Slave 或 Primary-Secondary 模式&#xff09;中&#xff0c;主要通过…

【AWS入门】AWS云计算简介

【AWS入门】AWS云计算简介 A Brief Introduction to AWS Cloud Computing By JacksonML 什么是云计算&#xff1f;云计算能干什么&#xff1f;我们如何利用云计算&#xff1f;云计算如何实现&#xff1f; 带着一系列问题&#xff0c;我将做一个普通布道者&#xff0c;引领广…

适合企业内训的AI工具实操培训教程(37页PPT)(文末有下载方式)

详细资料请看本解读文章的最后内容。 资料解读&#xff1a;适合企业内训的 AI 工具实操培训教程 在当今数字化时代&#xff0c;人工智能&#xff08;AI&#xff09;技术迅速发展&#xff0c;深度融入到各个领域&#xff0c;AIGC&#xff08;人工智能生成内容&#xff09;更是成…

【数据结构与算法】Java描述:第四节:二叉树

一、树的相关概念 编程中的树是模仿大自然中的树设计的&#xff0c;呈现倒立的结构&#xff0c;我们着重掌握 二叉树 。 1.1 基本概念&#xff1a; 结点的度&#xff1a;一个结点有几个子结点&#xff0c;度就是几&#xff1b; 如上图&#xff1a;A的度为3 树的度&#xff1…

Day5 结构体、文字显示与GDT/IDT初始化

文章目录 1. harib02b用例&#xff08;使用结构体&#xff09;2. harib02c用例3. harib02d用例&#xff08;显示字符图案&#xff09;3. harib02e用例&#xff08;增加字符图案&#xff09;4. harib02g用例4.1 显示字符串4.2 显示变量值 5. harib02h用例&#xff08;显示鼠标&a…

系统思考全球化落地

感谢加密货币公司Bybit的再次邀请&#xff0c;为全球团队分享系统思考课程&#xff01;虽然大家来自不同国家&#xff0c;线上学习的形式依然让大家充满热情与互动&#xff0c;思维的碰撞不断激发新的灵感。 尽管时间存在挑战&#xff0c;但我看到大家的讨论异常积极&#xff…

【开原宝藏】30天学会CSS - DAY1 第一课

下面提供一个由浅入深、按步骤拆解的示例教程&#xff0c;让你能从零开始&#xff0c;逐步理解并实现带有旋转及悬停动画的社交图标效果。为了更简单明了&#xff0c;以下示例仅创建四个图标&#xff08;Facebook、Twitter、Google、LinkedIn&#xff09;&#xff0c;并在每一步…

钉钉项目报销与金蝶系统高效集成技术解析

钉钉报销【项目报销类】集成到金蝶付款单【画纤骨】的技术实现 在企业日常运营中&#xff0c;数据的高效流转和准确对接是提升业务效率的关键。本文将分享一个具体的系统对接集成案例&#xff1a;如何将钉钉平台上的项目报销数据无缝集成到金蝶云星空的付款单系统中。本次方案…

Datawhale coze-ai-assistant:Task 1 了解 AI 工作流 + Coze的介绍

学习网址&#xff1a;Datawhale-学用 AI,从此开始 工作流&#xff08;Workflow&#xff09;是指完成一项任务或目标时&#xff0c;按照特定顺序进行的一系列活动或步骤。它强调在计算机应用环境下的自动化&#xff0c;通过将复杂的任务拆分成多个简单的步骤&#xff0c;每一步都…

深度学习 Deep Learning 第3章 概率论与信息论

第三章 概率与信息论 概述 本章介绍了概率论和信息论的基本概念及其在人工智能和机器学习中的应用。概率论为处理不确定性提供了数学框架&#xff0c;使我们能够量化不确定性和推导新的不确定陈述。信息论则进一步帮助我们量化概率分布中的不确定性。在人工智能中&#xff0c;…

GStreamer —— 2.15、Windows下Qt加载GStreamer库后运行 - “播放教程 1:Playbin 使用“(附:完整源码)

运行效果 介绍 我们已经使用了这个元素&#xff0c;它能够构建一个完整的播放管道&#xff0c;而无需做太多工作。 本教程介绍如何进一步自定义&#xff0c;以防其默认值不适合我们的特定需求。将学习&#xff1a; • 如何确定文件包含多少个流&#xff0c;以及如何切换 其中。…

MYsql—1

1.mysql的安装 在windows下安装mysql&#xff0c;直接官网搜索即可&#xff1a;http://www.mysql.com/&#xff0c;自己找想要的版本进行download&#xff0c;官网长这样 安装路径需要是英文路径&#xff0c;设置默认即可&#xff0c;若安装执行内容时报错&#xff0c;则AltCt…