快速排序——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是位运算,等价于除以2nth_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]); 输出每个元素。注意,每个数字后面都有一个空格,以区分不同的元素 。

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

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

相关文章

LeetCode刷题之HOT100之不同路径

2024/6/6 小雨&#xff0c;没停。明天就要高考啦&#xff0c;回想五年前我也带着紧张与期待走过这些天&#xff0c;祝高考学子一切顺利。Anyway&#xff0c;早上一到实验室我就去看望我的栀子花&#xff0c;带着满怀的期待去看它长大了多少&#xff0c;是的&#xff0c;花苞还在…

《开源模型食用指南》基于Linux环境快速部署开源模型,更适合中国宝宝的部署教程

今天给大家推荐一个非常适合中国宝宝学习的专属大模型教程&#xff0c;也就是它《开源模型食用指南》&#xff01; 当前百模大战正值火热&#xff0c;开源LLM层出不穷。 如今国内外已经涌现了众多优秀开源LLM&#xff0c;国外如LLaMA、Alpaca&#xff0c;国内如ChatGLM、BaiCh…

想了解Prompt 技术?看这篇就够了!

最近看了 Meta-Prompt&#xff0c;发现 Prompt 的技术已经发展了几代了。真的要好好梳理一下了。首先是官方有 一个自己的 Prompt engineer &#xff0c; 这个是一定要认真学习的。 https://platform.openai.com/docs/guides/prompt-engineering 官方建议&#xff1a; 写作清…

使用pexpect检查SSH上的文件是否存在

使用 pexpect 模块可以在 Python 中执行命令并检查其输出。你可以使用 ssh 命令连接到远程服务器&#xff0c;并执行 ls 命令检查文件是否存在。下面我就列举几个我经常遇到的几个错误并做个详细的解决方案。 1、问题背景 用户需要编写一个 Python 脚本&#xff0c;以检查一个…

python面向过程与初始面向对象编程

让我们穿越到《龙珠》世界&#xff0c;一起揭开 面向对象编程 的神秘面纱吧。 面向过程编程与面向对象编程 天下第一武道会 选手登记 第 22 届天下第一武道会即将召开&#xff0c;各路武术高手齐聚一堂&#xff0c;其中最受瞩目的&#xff0c;当属卡卡罗特&#xff08;孙悟…

我的创作纪念日--我和CSDN一起走过的1825天

机缘 第一次在CSDN写文章&#xff0c;是自己在记录学习Java8新特性中Lambda表达式的内容过程中收获的学习心得。之前也有记录工作和生活中的心得体会、难点的解决办法、bug的排查处理过程等等。一直都用的有道笔记&#xff0c;没有去和大家区分享的想法&#xff0c;是一起的朋…

C++第二十四弹---从零开始模拟STL中的list(上)

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】 目录 1、基本结构 2、基本函数实现 2.1、默认构造函数 2.2、尾插数据 3、迭代器的封装 3.1、迭代器的基本结构 3.2、迭代器重载函数的实现 4、迭…

大家都在用的4款超实用视频剪辑软件,快来码住自用吧!

随着自媒体行业的不断发展&#xff0c;不少小伙伴也逐渐步入了短视频的热潮。对于短视频制作来说&#xff0c;视频剪辑软件的选择非常重要。 如果剪辑软件不够好&#xff0c;整个视频就基本垮掉了。今天就给大家推荐4款好用的视频剪辑软件。 1.牛学长视频剪辑 推荐剪辑新手入门…

win11通过网线分享网络到Ubuntu工控机

1.条件&#xff1a;一个能无线联网的win11&#xff0c;一根网线&#xff0c;一台Ubuntu工控机&#xff0c;并且使用网线连接两者 2.在win11电脑上 2.1 打开控制面板的网络和Internet 2.2 进入网络和共享中心&#xff0c;在左侧进入 更改适配器设置 2.3 在WLAN上右键&#xff0…

如何通过Python SMTP配置示例发附件邮件?

Python SMTP配置的步骤&#xff1f;SMTP服务器的优缺点有哪些&#xff1f; 当我们需要发送包含附件的邮件时&#xff0c;自动化的解决方案显得尤为重要。Python提供了SMTP库&#xff0c;使我们能够轻松配置并发送带有附件的邮件。AokSend将通过一个示例来展示如何操作&#xf…

AIGC会带来失业潮吗?紧紧跟时代第一步,如何学习AIGC

会&#xff0c;但AI淘汰的始终是跟不上时代的人。 现在很多公司都有AI培训&#xff0c;不仅GPT&#xff0c;还有Midjourney、Stable DIffusion等一系列AI工具。 像我们公司虽然今年招的少&#xff0c;但也会对新招的应届生统一进行AI培训。 用任正非先生的话来说就是&#x…

【ARM】PK51-如何添加芯片型号的方法

【更多软件使用问题请点击亿道电子官方网站】 1、 文档目标 遇到打开工程提示没有该芯片设备提示如何解决。 2、 问题场景 客户发来一个工程文件&#xff0c;打开后软件提示没有发现该芯片设备提示。 图 1 3、软硬件环境 1&#xff09;、软件版本&#xff1a;keil μvision…

弗莱明发现青霉素

1945年&#xff0c;弗莱明因青霉素获诺贝尔医学奖。在弗莱明之前有多人注意到了青霉能抑制细菌的生长&#xff0c;但是他们没有一个人像弗莱明那样做进一步的更深入的研究&#xff0c;更没有一个人像弗莱明那样确定了这个特殊的现象是由于青霉分泌的某种物质所致。所以&#xf…

CAD入门基础

一&#xff0c;新建一个CAD文件 1.新建文件 2.保存为.dwt文件 3.画直线 点击直线图标画直线&#xff0c;选中直线出现高亮&#xff0c;点击左键&#xff0c;出现" 取消 " 就是可以画下一条线段了 " 删除"就可以了删除了。 3、直接删除法 1. 首先&#xf…

【C++】C++提供类型转换的机制

目录 前言&#xff1a; 一&#xff0c;static_cast 二&#xff0c;reinterpret_cast 三&#xff0c;const_cast 四&#xff0c;dynamic_cast 前言&#xff1a; 传统的不同类型转换有隐式类型转换&#xff08;类型不匹配时编译器自动进行的转换&#xff0c;如&#xff1a;i…

Simulink建立4WIS线性二自由度参考模型

4WIS线性二自由度参考模型 基于前轮转向做了小改动&#xff0c;难度不大&#xff0c;相当于两个微分方程加了两项 Simulink向CarSim中输入四个车轮的转角 有一点注意&#xff0c;四轮转向&#xff0c;前后轴车轮转角不应相等&#xff0c;否则动画会很滑稽 同侧车轮转向角的大小…

各种内部排序算法的比较及应用(插入排序、交换排序、选择排序、归并排序、基数排序)

目录 内部排序 前言 1.内部排序算法的比较 1.1各种排序算法的特点、比较和适用场景 1.2排序算法的稳定性判断及改进 1.3更适合采用顺序存储的排序算法 1.4根据排序的中间过程判断所采用的排序算法 1.5各种排序算法的性质 2.内部排序算法的应用 2.1选取排序算法时需要…

UE4_Ben_图形52_水下效果处理

学习笔记&#xff0c;不喜勿喷&#xff0c;欢迎指正&#xff0c;侵权立删&#xff01;祝愿生活越来越好&#xff01; 在这个后期处理的效果中&#xff0c;我们可以看到有很多不同的&#xff0c;这里有浓雾&#xff0c;波纹扭曲&#xff0c;镜头扭曲和边缘模糊&#xff0c;在第4…

pcb实验六-元件设计

目录 一&#xff0c;绘制28管脚PLCC封装ATF750C-10JC元件 二&#xff0c;绘制变压器原理图符号&#xff0c;并生成各种库文件输出报表 1&#xff0c;绘制变压器原理图 2&#xff0c;添加封装 3&#xff0c;输出报表文件 三&#xff0c;绘制音乐集成芯片及LCD元件 1&…

Apache漏洞复现:【CVE-2021-42013】【CVE_2021_41773】【CVE-2017-15715】

声明 严禁读者利用本文介绍知识点对网站进行非法操作 , 本文仅用于技术交流和学习 , 如果您利用文章中介绍的知识对他人造成损失 , 后果由您自行承担 , 如果您不能同意该约定 , 请您务必不要阅读该文章 , 感谢您的配合 ! 远程代码执行 CVE-2021-42013 描述 Apache HTTP Ser…