快速排序——AcWing785.快速排序

AcWing785.快速排序

题目描述

785. 快速排序 - AcWing题库

运行代码

#include <iostream>
#include <algorithm>
using namespace std;
const int N = 1e6+6;
int q[N];
void quick_sort(int q[], int l, int r)
{
    if (l >= r) return;
    int m = l + r >> 1;//>>1是位运算,等价于除以2
    nth_element(q + l, q + m, q + r);//nth_element用于快速选择中位数
    quick_sort(q, l, m);
    quick_sort(q, m + 1, r);
}

int main()
{
    int n;
    cin>>n;
    for (int i = 0; i < n; i ++ ) 
    cin>>q[i];
    quick_sort(q, 0, n);
    for (int i = 0; i < n; i ++ )
    cout<<q[i]<<" ";
    return 0;
}

代码思路

通常的快速排序算法会选择一个"pivot"(基准元素),然后将数组分为两部分:一部分是小于基准的元素,另一部分是大于基准的元素。选择使用std::nth_element函数来直接找到分区中的中位数(或确切地说,是第m个元素,其中m = (l + r) / 2),并将这个元素放到正确的位置,从而达到部分排序的目的。这种方法相较于传统的选取首个元素或随机选取元素作为基准,可能在某些数据分布下有更好的性能表现。

代码解析

  1. #include指令和命名空间: 引入必要的头文件<iostream><algorithm>,并使用std命名空间。常量定义: const int N = 1e6+6; 定义了一个足够大的数组大小,用于存放至多10^6个整数。

  2. quick_sort函数: 实现了快速排序的递归逻辑。

    • 输入参数: 整型数组的起始指针q, 左边界索引l, 右边界索引r
    • 基础情况: 当左边界等于或大于右边界时,递归结束。
    • 选择中位数: 使用nth_element将数组的中位数放到正确的位置。这一步代替了传统快速排序中选择基准元素的过程。
    • 递归调用: 分别对中位数左边和右边的子序列进行递归排序。
  3. main函数:读取数组: 从标准输入读取整数n,表示数组长度,然后读取n个整数到数组q中。排序数组: 调用quick_sort函数对数组进行排序。输出结果: 将排序后的数组元素输出到标准输出。

改进空间

  1. 避免全局变量:尽量不要使用全局变量,特别是数组q[N]。这会影响代码的可重用性和模块化。可以将数组作为参数传递给quick_sort函数,同时考虑使用std::vector<int>来自动管理内存,这样可以更灵活地处理不同大小的数据集。

  2. 异常处理和输入验证:增加对输入的验证,例如检查n是否在合理范围内,防止数组越界。同时,可以考虑加入异常处理机制,提升程序的健壮性。

  3. 优化递归调用:虽然nth_element的使用简化了代码,但直接在快速排序中使用可能不是最高效的,因为它不提供两边的分割点,可能导致递归深度较大。传统快速排序中选择枢轴的方式(如三数取中法)可能在多数情况下提供更好的性能。

  4. 尾递归优化:虽然C++标准并未规定编译器必须执行尾递归优化,但在递归调用中,可以考虑调整逻辑,使其更接近尾递归形式,尽管现代编译器对于递归深度的优化已经做得很好,但良好的编程习惯仍值得提倡。

  5. 使用迭代而非递归(可选):对于非常大的数据集,递归可能导致栈溢出。虽然这不是常见的问题,但作为一种优化手段,可以考虑将递归逻辑转换为循环迭代,使用栈来手动管理递归状态。

  6. 添加函数注释和文档:代码的可读性和可维护性可以通过添加函数注释和总体说明来提升,使得其他阅读者更容易理解代码逻辑。

改进代码

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
void quick_sort(vector<int>& nums, int l, int r) {
    if (l >= r) return;
    int mid = l + (r - l) / 2;
    nth_element(nums.begin() + l, nums.begin() + mid, nums.begin() + r + 1);
    quick_sort(nums, l, mid);
    quick_sort(nums, mid + 1, r);
}
int main() {
    int n;
    cin >> n;
    vector<int> nums(n);
    for (int i = 0; i < n; i++) {
        cin >> nums[i];
    }
    quick_sort(nums, 0, n - 1);
    for (const auto& num : nums) {
        cout << num << " ";
    }
    return 0;
}

使用vector<int>替代全局数组,并对输入数据进行了封装,提高了代码的灵活性和可维护性。 

上述代码运行时间太长了

提供几种更快的运行代码

代码另解

#include<algorithm>
using namespace std;
int main()
{
    int n, a[100000];
    int i;
    scanf("%d",&n);
    for (i = 0; i < n; i++)
    {
        scanf("%d", &a[i]);
    }
    sort(a, a + n);
    for (i = 0; i < n; i++)
    {
        printf("%d ", a[i]);
    }

}
  1. 读取数组元素:scanf("%d",&n); 读取用户输入的数组长度n。接下来的循环for (i = 0; i < n; i++) 读取用户输入的每个整数,并存储到数组a中。scanf("%d", &a[i]); 实现了这一操作。

  2. 排序数组:sort(a, a + n); 使用了STL中的sort函数对数组a进行排序。aa + n作为参数,分别表示待排序数组的起始地址和结束地址(不含结束地址),这会按照升序排列数组中的元素。

  3. 输出排序后的数组:通过循环for (i = 0; i < n; i++) 遍历排序后的数组,并使用printf("%d ", a[i]); 输出每个元素。注意,每个数字后面都有一个空格,以区分不同的元素 。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux网络编程:回顾网络通信

1.数据从应用层到数据链路层的本质 数据的封装&#xff1a; 用户在用户级缓冲区输入数据&#xff0c;经过应用层协议进行序列化成字节流数据&#xff0c;拷贝到传输层的缓冲区。而操作系统在传输层维护了sk_buff这一个结构体&#xff0c;然后data指针指向这段数据的开头&#x…

用Conda配置Pytorch环境 (pytorch==2.2.1)

用Conda配置Pytorch环境 (pytorch==2.2.1) 本文主要讲解: 如何用Conda搭建Pytorch环境,用Conda的方式安装,不需要单独去安装Cuda了。 1. 安装miniconda https://docs.anaconda.com/free/miniconda/index.html 2. 搭建虚拟环境 激活python虚拟环境 conda create -n env…

618哪些品牌好入手?四款主流数码产品,必看!

随着618购物狂欢节的钟声逐渐敲响&#xff0c;你是否在面对繁多的商品时感到一丝迷茫&#xff0c;想要找到那些既引领潮流又极具实用价值的商品&#xff1f;团团精心为你准备了一份个人实测后的好物推荐清单。这些商品不仅紧跟时尚潮流&#xff0c;更是你生活中的得力助手&…

全域外卖推广怎么做才能赚钱?

当前&#xff0c;全域外卖行业的热度持续飙升&#xff0c;许多创业者在了解完全域外卖项目的基本信息之后&#xff0c;便开始将目光转向与全域外卖推广相关的各项事宜之中&#xff0c;誓要将全域外卖行业彻底摸清后再行入局。 从理论层面上来说&#xff0c;这种思路并没有任何问…

sqlilabs靶场安装

05-sqllabs靶场安装 1 安装 1 把靶场sqli-labs-master.zip上传到 /opt/lampp/htdocs 目录下 2 解压缩 unzip sqli-labs-master.zip3 数据库配置 找到配置文件,修改数据库配置信息 用户名密码&#xff0c;修改为你lampp下mysql的用户名密码&#xff0c;root/123456host:la…

OrCAD17.4原理图DRC各选项注释

OrCAD17.4原理图DRC各选项注释 一、旧版本OrCAD原理图DRC选项注释 链接&#xff1a;https://pan.baidu.com/s/1bq59A-PoXHC0YNVdX9k-bQ?pwdyqcg 提取码&#xff1a;yqcg 二、Options Online DRC&#xff1a;在线设计DRCDRC Action&#xff1a;DRC运行模式。Run on Design—…

YOLOv5改进 | 主干网络 | 用SimRepCSP作为主干网络提取特征【附完整代码 + 降本增效】

&#x1f4a1;&#x1f4a1;&#x1f4a1;本专栏所有程序均经过测试&#xff0c;可成功执行&#x1f4a1;&#x1f4a1;&#x1f4a1; SimRepCSP 类似于 YOLOv7的主干网络&#xff0c;由卷积模块和重参数化卷积&#xff08;RepConv&#xff09;模块组合而成&#xff0c;以 Cro…

搭建Vulnhub靶机网络问题(获取不到IP)

搭建好靶场后&#xff0c;在攻击机运行arp-scan -l无法发现靶机IP。 这时候去看下靶机网络有没有问题。 重新启动客户机&#xff0c;一直按e进入安全模式&#xff08;要是直接开机了就先按shift进入grub界面&#xff0c;再按e&#xff09;找到ro&#xff0c;将ro改为rw signie…

大坝监测资料分析的新规范与实践

在大坝安全管理中&#xff0c;监测资料分析是一个至关重要的环节。为确保大坝的长期稳定性和安全性&#xff0c;新的规范对监测资料分析的内容和方法进行了详细的规定和改进。本文将探讨这些改进的具体内容及其实施方法。 点击输入图片描述&#xff08;最多30字&#xff09; 监…

2024年最新测评,6款好用的在线代码编辑器推荐

前言 在线IDE对于每一位开发来说都是一种福利&#xff0c;无需下载安装到本地进行安装&#xff0c;安装完成以后还要配置环境&#xff0c;极其繁琐&#xff0c;在线IDE很好的规避了这些琐事&#xff0c;除此之外在线IDE无需占用本地内存以及本地计算计算资源&#xff0c;还能实…

【python】ValueError: If using all scalar values, you must pass an index

成功解决“ValueError: If using all scalar values, you must pass an index”错误的全面指南 在Pandas库中&#xff0c;当你尝试创建一个新的DataFrame或Series时&#xff0c;如果所有值都是标量&#xff08;scalar&#xff0c;即单个值而非列表、数组或Series&#xff09;…

SpringBoot+Vue课程作业管理系统(前后端分离)

技术栈 JavaSpringBootMavenMySQLMyBatisVueShiroElement-UI 系统角色 学生教师管理员 系统功能截图

Go 1.19.4 语法基础-Day 02

1. 注释 1.1 多行注释 1.1.1 方式一&#xff08;不推荐使用&#xff09; package main/* 多行注释test函数的作用参数a类型和作用参数b类型和作用参数c类型和作用 */ func test1(a int, b string, c bool){}1.1.2 方式二&#xff08;推荐&#xff09; go的源码库中也是使用这…

Aigtek高压放大器在纳米材料中的应用研究

随着纳米材料科学的迅速发展&#xff0c;纳米材料在各个领域中的应用也逐渐扩展。而高压放大器作为一种重要的电子元件&#xff0c;在纳米材料研究中起着至关重要的作用。下面将介绍高压放大器在纳米材料研究中的应用以及相关的研究进展。 高压放大器是一种能够将输入信号放大到…

【论文精读】DCRNN-扩散图卷积循环神经网络

DCRNN 模型是南加州大学的 Li 等人发表在 I C L R 2018 ICLR 2018 ICLR2018 会议上一个用于交通预测的时空预测模型&#xff0c;论文题目为: 《DIFFUSION CONVOLUTIONAL RECURRENT NEURAL NETWORK: DATA-DRIVEN TRAFFIC FORECASTING》&#xff0c;文章地址为: https://arxiv.o…

算法导论实战(三)(算法导论习题第十六章)

&#x1f308; 个人主页&#xff1a;十二月的猫-CSDN博客 &#x1f525; 系列专栏&#xff1a; &#x1f3c0;算法启示录 &#x1f4aa;&#x1f3fb; 十二月的寒冬阻挡不了春天的脚步&#xff0c;十二点的黑夜遮蔽不住黎明的曙光 前言 算法导论的知识点学习将持续性更新在算…

ARM32开发--GPIO输入模式

知不足而奋进 望远山而前行 目录 文章目录 前言 浮空输入 上拉输入 下拉输入 模拟输入 总结 前言 在数字电路设计和嵌入式系统开发中&#xff0c;理解输入信号的处理方式对确保系统稳定性和可靠性至关重要。不同的输入处理方式包括上拉输入、下拉输入、浮空输入和模拟输…

【C#学习笔记】属性和字段

文章目录 前言属性和字段的区别字段访问修饰符和关键字定义变量类型的定义变量命名变量的赋值 属性 不同的使用情况 前言 最近在工作的过程中常常会觉得自己在程序设计方面的能力还是有欠缺。例如一直对于变量的声明感到不足&#xff0c;在工作中为了图方便总是直接public定义…

Nvidia Jetson/Orin +FPGA+AI大算力边缘计算盒子:无人机自主飞行软件平台

案例简介 北京泛化智能科技有限公司&#xff08;gi&#xff09;所主导开发的 Generalized Autonomy Aviation System (GAAS) 是为无人机以及城市空中交通 (UAM, Urban Air Mobility) 所设计的开源无人机自主飞行框架。通过 SLAM、路径规划和 Global Optimization Graph 等功能…

骨传导耳机有哪些是值得入手的?看完这篇推荐就懂了!

骨传导耳机在运动圈非常的受欢迎&#xff0c;因为佩戴运动的时候&#xff0c;骨传导耳机能够稳固佩戴&#xff0c;无论是跳跃或者是摇晃身体等&#xff0c;耳机都不会轻易掉落&#xff01;而很多朋友对于骨传导耳机总是想尝试却又害怕掉坑&#xff01;于是为了给大家提供更多的…