【洛谷 P1177】【模板】快速排序 题解(快速排序+数组索引)

简介: **快速排序模板题目**,要求使用快排算法对输入的整数序列进行排序。输入包含正整数N和N个整数,输出排序后的序列。20%的数据N≤10^3,所有数据N≤10^5。代码中提供了一种实现,包括读取输入、定义partition函数划分数组、递归调用quickSort及主函数执行排序和输出。注意C++选手避免使用STL的`sort`。

【模板】快速排序

题目描述

利用快速排序算法将读入的 $N$ 个数从小到大排序后输出。

快速排序是信息学竞赛的必备算法之一。对于快速排序不是很了解的同学可以自行上网查询相关资料,掌握后独立完成。(C++ 选手请不要试图使用 STL,虽然你可以使用 sort 一遍过,但是你并没有掌握快速排序算法的精髓。)

输入格式

第 $1$ 行为一个正整数 $N$,第 $2$ 行包含 $N$ 个空格隔开的正整数 $a_i$,为你需要进行排序的数,数据保证了 $a_i$ 不超过 $10^9$。

输出格式

将给定的 $N$ 个数从小到大输出,数之间空格隔开,行末换行且无空格。

样例 #1

样例输入 #1

5
4 2 4 5 1

样例输出 #1

1 2 4 4 5

提示

对于 $20\%$ 的数据,有 $N\leq 10^3$;

对于 $100\%$ 的数据,有 $N\leq 10^5$。

思路

快速排序。数据过大,需要打开O2优化。

AC代码

#include <iostream>
#define AUTHOR "HEX9CF"
using namespace std;

void read(int &x){
   
    x = 0;
    char ch;
    while (('0' > ch || '9' < ch))
    {
   
        ch = getchar();
    }
    while (!('0' > ch || '9' < ch))
    {
   
        x = x * 10 + ch - '0';
        ch = getchar();
    }
}

int partition(int a[], int low, int high)
{
   
    int i = low, j = high, pivot = a[low];
    while (i < j)
    {
   
        while (i < j && a[j] > pivot) // 向左扫描
        {
   
            j--;
        }
        while (i < j && a[i] <= pivot) // 向右扫描
        {
   
            i++;
        }
        if (i < j)
        {
   
            swap(a[i++], a[j--]);
        }
    }
    if (a[i] > pivot)
    {
   
        swap(a[i - 1], a[low]);
        return i - 1;
    }
    else
    {
   
        swap(a[i], a[low]);
        return i;
    }
}

void quickSort(int a[], int low, int high)
{
   
    if (low < high)
    {
   
        int mid = partition(a, low, high);
        quickSort(a, low, mid - 1);
        quickSort(a, mid + 1, high);
    }
}

int n;

int main()
{
   
    read(n);
    int *arr = new int[n];
    for (int i = 0; i < n; i++)
    {
   
        read(arr[i]);
    }
    quickSort(arr, 0, n - 1);
    for (int i = 0; i < n; i++)
    {
   
        cout << arr[i] << " ";
    }
    delete[] arr;
    return 0;
}
目录
相关文章
|
消息中间件 缓存 监控
订单系统的优化
订单系统的优化
|
机器学习/深度学习 算法
概率分布深度解析:PMF、PDF和CDF的技术指南
本文将深入探讨概率分布,详细阐述概率质量函数(PMF)、概率密度函数(PDF)和累积分布函数(CDF)这些核心概念,并通过实际示例进行说明。
2208 15
概率分布深度解析:PMF、PDF和CDF的技术指南
|
存储 Python
提升工作效率:获取任意月份的所有工作日
本文介绍了如何使用 Python 编写一个简单程序,以获取任意月份的所有工作日。通过 `datetime` 和 `calendar` 模块,程序能够准确地识别出每个月的周一至周五,帮助用户高效管理时间和任务。
561 6
|
机器学习/深度学习 人工智能 数据处理
【AI系统】NV Switch 深度解析
英伟达的NVSwitch技术是高性能计算领域的重大突破,旨在解决多GPU系统中数据传输的瓶颈问题。通过提供比PCIe高10倍的带宽,NVLink实现了GPU间的直接数据交换,减少了延迟,提高了吞吐量。NVSwitch则进一步推动了这一技术的发展,支持更多NVLink接口,实现无阻塞的全互联GPU系统,极大提升了数据交换效率和系统灵活性,为构建强大的计算集群奠定了基础。
1566 4
|
存储 机器学习/深度学习 缓存
Hadoop-07-HDFS集群 基础知识 分布式文件系统 读写原理 读流程与写流程 基本语法上传下载拷贝移动文件
Hadoop-07-HDFS集群 基础知识 分布式文件系统 读写原理 读流程与写流程 基本语法上传下载拷贝移动文件
391 1
|
SQL 分布式计算 Hadoop
Hadoop-34 HBase 安装部署 单节点配置 hbase-env hbase-site 超详细图文 附带配置文件
Hadoop-34 HBase 安装部署 单节点配置 hbase-env hbase-site 超详细图文 附带配置文件
666 2
|
C++
【洛谷 P1739】表达式括号匹配 题解(栈)
该编程题目要求检查给定的包含字母、运算符和括号的表达式是否括号匹配。输入为一行表达式,以`@`结束。如果括号匹配,输出`YES`,否则输出`NO`。样例包括一个匹配和一个不匹配的表达式。解决方案是使用栈,遇到左括号入栈,遇到右括号时判断栈是否为空,栈空则输出`NO`,否则出栈。当读到`@`时,栈空则输出`YES`,否则输出`NO`。提供的AC代码使用C++实现,通过`stack`处理括号匹配。
535 0
|
C++
【洛谷 P1042】[NOIP2003 普及组] 乒乓球 题解(模拟+向量)
`NOIP2003`普及组编程题:乒乓球比赛模拟。给定一系列球赛记录(WL序列),程序需按11分和21分制分析比分。输入含多个字符串,含W(华华得分)、L(对手得分)和E(结束标记)。输出每局比分,分制间空行间隔。样例:`WWWWWW...` → `11:0\n11:0\n1:1`(11分制)和`21:0\n2:1`(21分制)。代码使用C++,逐字符读取,当分差≥2且得分≥x时输出比分。
377 0
|
SQL Java 数据库连接
mybatis plus :mybatis简化了jdbc,mybatisplus简化了mybatis
mybatis plus :mybatis简化了jdbc,mybatisplus简化了mybatis
551 0
|
自然语言处理 数据挖掘 数据建模
淘宝用户体验分析方法论(下)
淘宝用户体验分析方法论(下)
1286 0

热门文章

最新文章