第 11 章 排序
https://www.luogu.com.cn/problem/P1177https://www.luogu.com.cn/problem/P1177# P1177 【模板】排序## 题目描述将读入的 $N$ 个数从小到大排序后输出。## 输入格式第一行为一个正整数 $N$。第二行包含 $N$ 个空格隔开的正整数 $a_i$为你需要进行排序的数。## 输出格式将给定的 $N$ 个数从小到大输出数之间空格隔开。## 输入输出样例 #1### 输入 #154 2 4 5 1### 输出 #11 2 4 4 5## 说明/提示对于 $20\%$ 的数据有 $1 \leq N \leq 10^3$对于 $100\%$ 的数据有 $1 \leq N \leq 10^5$$1 \le a_i \le 10^9$。1.插入排序1算法思想待排序元素插入已排序序列中2代码加优化#includeiostream using namespace std; typedef long long ll; const ll N 1e56; ll a[N]; int main(){ ll n; cin n; for(ll i 1;i n;i) cin a[i]; for(ll i 2;in;i){ if(a[i] a[i-1]) continue; ll t a[i]; for(ll j 1;ji;j){ if(a[i]a[j]){ for(ll k i-1;kj;k--){ a[k1]a[k]; } a[j] t; break; } } } for(ll i 1;i n;i) cout a[i] ; }此时代码时间复杂度O(n^3),时间复杂度过高注意到第二个for循环的作用是定t的位置第三个for循环是移位那么可不可以直接在移步中定位呢当然可以#includeiostream using namespace std; typedef long long ll; const ll N 1e56; ll a[N]; int main(){ ll n; cin n; for(ll i 1;i n;i) cin a[i]; for(ll i 2;in;i){ ll t a[i]; ll j i-1; while(j1 a[j]t){ a[j1] a[j]; j--; } a[j1] t; } for(ll i 1;i n;i) cout a[i] ; }这题不是ac,是插入排序本身复杂但方法一定要掌握2选择排序1算法思想每次找到未排中最小的放有序序列后面2错误典例代码分析#includeiostream using namespace std; typedef long long ll; const ll N 1e56; ll a[N]; ll id 2; ll minn 1e9; int main(){ ll n; cin n; for(ll i 1;i n;i) cin a[i]; for(int i 1;i n;i){ for(int j n;ji;j--){ if(a[j] minn){ minn a[j]; id j; } } if(a[id]a[i]){ ll t a[i]; a[i] a[id]; a[id] t; } } for(ll i 1;i n;i) cout a[i] ; }错误点minn的作用是找到未排序列如果定义为全局变量那前面的都可以#includeiostream using namespace std; typedef long long ll; const ll N 1e56; ll a[N]; ll id 2; int main(){ ll n; cin n; for(ll i 1;i n;i) cin a[i]; for(int i 1;i n;i){ ll minn 1e9; for(int j n;ji;j--){ if(a[j] minn){ minn a[j]; id j; } } if(a[id]a[i]){ ll t a[i]; a[i] a[id]; a[id] t; } } for(ll i 1;i n;i) cout a[i] ; }那么有什么办法可以优化吗3优化1minn没有必要a[id]就可以搞定2第一层for循环不需要遍历n,因为最后一个数就一定有序3cppSTL库里有交换swap#includeiostream using namespace std; typedef long long ll; const ll N 1e56; ll a[N]; int main(){ ll n; cin n; for(ll i 1;i n;i) cin a[i]; for(int i 1;i n;i){ ll id i; for(int j n;ji;j--){ if(a[j] a[id]){ id j; } } swap(a[i],a[id]); } for(ll i 1;i n;i) cout a[i] ; }没错,他的复杂度更坏是铁钉钉的O(n^2)3,冒泡排序1算法思想执行n-1趟每趟从前往后比较未排序区间两相邻元素若逆序就交换每次在最后定下一个较大数#includeiostream using namespace std; typedef long long ll; const ll N 1e59; ll a[N]; int main(){ ll n; cin n; for(int i 1;i n;i) cin a[i]; for(ll i 1;i n;i){ for(int j 1;jn-i;j){ if(a[j]a[j1] ){ swap(a[j1],a[j]); } } } for(ll i 1;i n;i) cout a[i] ; }2优化优化一直接根据第几趟来定第二个循环边界#includeiostream using namespace std; typedef long long ll; const ll N 1e59; ll a[N]; int main(){ ll n; cin n; for(int i 1;i n;i) cin a[i]; for(ll i n;i 1;i--){ for(int j 1;ji;j){ if(a[j]a[j1] ){ swap(a[j1],a[j]); } } } for(ll i 1;i n;i) cout a[i] ; }优化二若某一趟操作中没有执行元素交换操作时证明已经有序-没有必要继续了#includeiostream using namespace std; typedef long long ll; const ll N 1e59; ll a[N]; int main(){ ll n; cin n; for(int i 1;i n;i) cin a[i]; for(ll i n;i 1;i--){ int front 0; for(int j 1;ji;j){ if(a[j]a[j1] ){ swap(a[j1],a[j]); front 1; } } if(front 0) break; } for(ll i 1;i n;i) cout a[i] ; }4堆排序1算法思想用堆实现优化选择排序2步骤1建堆升序大根堆降序小根堆流程从倒数第一个非叶子结点开始执行向下调整算法直至根节点2排序流程每次将堆顶元素与堆中最后一个元素交换堆大小减1然后将堆顶元素向下调整直至堆中只有一个元素3代码#include iostream using namespace std; const int N 1e5 10; int n; int a[N]; // down函数向下调整parent父节点len当前堆的有效大小 void down(int parent, int len) { int child parent * 2; // 左孩子下标 while(child len) { // 如果右孩子存在且右孩子值更大child切换到右孩子 if(child 1 len a[child 1] a[child]) child; // 父节点已经大于等于最大孩子不用调整直接退出 if(a[parent] a[child]) return; swap(a[parent], a[child]); parent child; // 父节点下沉到孩子位置 child parent * 2; // 更新为新的左孩子 } } void heap_sort() { // 第一步建大根堆从最后一个非叶子结点 n/2 往前遍历到1 for(int i n / 2; i 1; i--) { down(i, n); } // 第二步堆排序不断把堆顶最大值放到数组末尾 for(int i n; i 1; i--) { swap(a[1], a[i]); // 堆顶(最大值)和堆末尾元素交换 down(1, i - 1); // 对剩下i‑1个元素重新向下调整 } } int main() { cin n; for(int i 1; i n; i) cin a[i]; heap_sort(); for(int i 1; i n; i) cout a[i] ; return 0; }5快速排序1算法图解2算法思想1待排序区间选一个基准元素按基准元素大小把区间分为两部分2递归处理两部分直到区间长度为13缺陷so......在实现过程中我们会遇到哪些问题呢1基准元素怎么选2元素大量重复递归层数过多---进化一下吧4优化优化一随机选择基准元素随机函数srand(time(0));//种下随机数种子 rand();//获得一个随机数 rand()%(right-left1)left//区间随机数优化二数组分三块​ #include iostream #include ctime using namespace std; const int N 1e5 10; int n; int a[N]; // 获取随机下标 int get_random(int left, int right) { return rand() % (right - left 1) left; } void quick_sort(int left, int right) { if(left right) return; int p get_random(left, right); int pivot a[p]; // 基准值 // 荷兰国旗三分 int l left - 1, i left, r right 1; while(i r) { if(a[i] pivot) swap(a[l], a[i]); else if(a[i] pivot) i; else swap(a[--r], a[i]); } quick_sort(left, l); quick_sort(r, right); } int main() { srand(time(0)); cin n; for(int i 1; i n; i) cin a[i]; quick_sort(1, n); for(int i 1; i n; i) cout a[i] ; return 0; } ​6.并归排序1算法思想分治1只要能分就一分为二将左右区间排序2左右区间合并一起2代码#include iostream using namespace std; const int N 1e5 10; int n; int a[N]; int tmp[N]; // 临时数组用来合并时暂存数据 void merge_sort(int left, int right) { if(left right) return; // 区间只有一个数不用排序 // 1.区间对半拆分 int mid (left right) 1; //等价于 (leftright)/2 // [left , mid] 和 [mid1 , right] merge_sort(left, mid); //递归排左半段 merge_sort(mid 1, right); //递归排右半段 // 2.合并两个已经有序的数组 int cur1 left, cur2 mid 1, i left; while(cur1 mid cur2 right) { if(a[cur1] a[cur2]) tmp[i] a[cur1]; else tmp[i] a[cur2]; } // 把剩下没处理完的部分直接拷贝进tmp while(cur1 mid) tmp[i] a[cur1]; while(cur2 right) tmp[i] a[cur2]; // 把tmp结果复制回原数组a for(int j left; j right; j) { a[j] tmp[j]; } } int main() { cin n; for(int i 1; i n; i) cin a[i]; merge_sort(1, n); for(int i 1; i n; i) cout a[i] ; return 0; }

相关新闻

SRAM‑HBM 分块调度:大模型真正的瓶颈从来不是算力

SRAM‑HBM 分块调度:大模型真正的瓶颈从来不是算力

马斯克在近期访谈中提到,AI 的最大约束是内存,而不是原始算力。很多文章还在比拼 TFLOPS 算力指标,但真正卡死长上下文、训练吞吐、推理延迟的,是 HBM 与片上 SRAM 之间的数据搬运开销CSDN博…。 很多人有一个误区:GPU 计算单元越强,大模型跑的就越快。现实恰恰相反,绝大…

2026/10/12 8:44:07 阅读更多 →
算法刷题记录 —— 字母异位词分组(Group Anagrams)

算法刷题记录 —— 字母异位词分组(Group Anagrams)

题目链接:49. 字母异位词分组 题目分析 这道题刚看到的时候确实没什么头绪。现在回过头来理解,核心思想其实非常简洁:利用哈希表的键值对机制——同一个键只能对应一条记录。​ 对于 "ant"、"tna"、"tan" 这…

2026/10/10 17:50:13 阅读更多 →
【Logisim 本地搭建】手动版无符号 8 位乘法器的详细教程

【Logisim 本地搭建】手动版无符号 8 位乘法器的详细教程

1. 引言 在数字逻辑与计算机组成原理的学习中,乘法器是一个核心组件,它展示了如何利用基本的逻辑门来实现复杂的算术运算。本教程将带领你在 Logisim 中构建一个手动版的无符号 8 位乘法器,通过清晰的步骤和原理讲解,让你掌握其设…

2026/10/10 17:50:37 阅读更多 →

最新新闻

看病老是记不住医生说的?一套AI辅助记录实操,把医嘱、用药、复诊整理成清单

看病老是记不住医生说的?一套AI辅助记录实操,把医嘱、用药、复诊整理成清单

去医院时,医生语速快、信息密,患者紧张,家属不在身边,老人听力或方言沟通有障碍。走出诊室,常常只记得“先吃药、下次复查”,具体剂量、频次、忌口、检查注意事项却模糊了。行业现状是,越来越多…

2026/10/12 12:27:43 阅读更多 →
晋级答辩复盘总漏重点?实测5款AI记录工具,附统一打分维度与选型建议

晋级答辩复盘总漏重点?实测5款AI记录工具,附统一打分维度与选型建议

晋级答辩、职级评审、转正答辩这类场景,真正让人头疼的往往不是现场发挥,而是事后复盘。现场节奏快,评委追问密集,多人交叉发言,还夹杂专业术语和项目缩写。靠回忆补纪要,很容易漏掉关键问题。这两年AI记录…

2026/10/12 12:27:43 阅读更多 →
神经网络实现Fashion-MNIST图像分类:完整代码与调试指南

神经网络实现Fashion-MNIST图像分类:完整代码与调试指南

简介:这一压缩包面向机器学习初学者、深度学习入门者以及需要动手实践图像分类任务的学生,围绕Fashion-MNIST时装数据集提供一整套可运行的神经网络分类实现。包内文件共2个,包含Python源文件和Word说明文档,整体大小仅559KB&…

2026/10/12 12:27:43 阅读更多 →
K8s面试128题这样学:拆解、验证、复盘三步法

K8s面试128题这样学:拆解、验证、复盘三步法

简介:面向云原生与容器技术相关岗位的求职者,这套面试题集锦共整理一百二十八道高频考题,覆盖分布式键值数据库的特性与适用场景、集群管理核心概念、常见部署方式、主节点与工作节点的职责、最小调度单元与标签机制等基础原理,也…

2026/10/12 12:27:43 阅读更多 →
全屋定制AI智能体:解决改图与拆单难题的架构设计与落地实践

全屋定制AI智能体:解决改图与拆单难题的架构设计与落地实践

1. 全屋定制行业的老大难:改图与拆单,到底卡在哪先说一个我经常在行业交流群里看到的场景。某定制品牌的项目群里,设计师发了一张柜体结构图,接着是一句:“客户刚打电话说,客厅电视柜的深度从350改成420&am…

2026/10/12 12:27:43 阅读更多 →
彻底告别OpenClaw使用焦虑:我给他装上了“透视眼”和“批量克隆模组”

彻底告别OpenClaw使用焦虑:我给他装上了“透视眼”和“批量克隆模组”

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 12:26:42 阅读更多 →

日新闻

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

在数码相机、高清显示屏与现代矢量图形技术高度发达的今天,画面可以做到绝对的锐利、平滑与无瑕。然而,当一张秋日手账插画或拍立得照片过于“平整无瑕”时,往往会散发出一种冰冷生硬的“数码塑料感(Digital Plasticity&#xff0…

2026/10/12 0:00:59 阅读更多 →
活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

在现代网页与移动端设计中,横排(Horizontal Layout)早已经成为了绝对的主流。然而,当我们翻开泛黄的线装古籍、宋版木刻诗集,或是欣赏一张茶道雅集的手写便签时,那种**自上而下纵向书写、自右向左逐列铺展&…

2026/10/12 0:00:59 阅读更多 →
周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

每到周日的晚上八点到十点,很多人心里都会悄悄亮起一盏警示灯。 在心理学上,这种现象有一个专门的称谓——“周日夜晚焦虑症(Sunday Scaries)”。明天又是周一,闹钟又要重新在七点响彻卧房;脑海里仿佛有一个…

2026/10/12 0:00:59 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/12 0:16:30 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/12 0:16:43 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 10:45:37 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:53 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:54 阅读更多 →