排序的定义

这个不用说吧
就是根据某个条件对一个数列进行有序的操作
例如要求从小到大排序、从大到小排序等等

排序的分类

比较排序(Comparison(Comparison(Comparison Sorts)Sorts)Sorts)

特点:通过元素间的比较决定顺序
时间复杂度下限O(nO(nO(n logloglog n)n)n)

排序算法平均时间复杂度空间复杂度稳定性特点
冒泡排序O(n2)O(n²)O(n2)O(1)O(1)O(1)稳定简单但慢
选择排序O(n2)O(n²)O(n2)O(1)O(1)O(1)不稳定每次选最小放前面
插入排序O(n2)O(n²)O(n2)O(1)O(1)O(1)稳定对小规模数据高效
快速排序O(nO(nO(n logloglog n)n)n)O(logn)O(log n)O(logn)不稳定分治思想,实际最快
归并排序O(nO(nO(n logloglog n)n)n)O(n)O(n)O(n)稳定分治+合并,需额外空间
堆排序O(nO(nO(n logloglog n)n)n)O(1)O(1)O(1)不稳定利用堆结构

非比较排序(Non−Comparison(Non-Comparison(NonComparison Sorts)Sorts)Sorts)

特点:不直接比较元素,利用数值特性
时间复杂度:可突破O(nO(nO(n logloglog n)n)n)下限

排序算法时间复杂度空间复杂度稳定性适用场景
计数排序O(n+k)O(n+k)O(n+k)O(k)O(k)O(k)稳定整数且范围小(kkk为范围)
桶排序O(n+k)O(n+k)O(n+k)O(n+k)O(n+k)O(n+k)稳定数据均匀分布
基数排序O(d(n+k))O(d(n+k))O(d(n+k))O(n+k)O(n+k)O(n+k)稳定整数按位排序(ddd为位数)

建议

  • 通用快速排序(STL 的 sort
  • 稳定归并排序(STL 的 stable_sort
  • 小范围整数计数排序
  • 数据大堆排序(避免快排递归栈溢出)

:实际代码实现需根据数据特点选择

模板代码示例

这里给出常用的冒泡排序、选择排序、快速排序等
内容解释在代码注释里,全是干货可以直接食用

冒泡排序

#include<iostream>
using namespace std;
const int N=1e5+10;
int a[N];
int main(){int n;cin>>n;for(int i=1;i<=n;i++)cin>>a[i];//核心代码for(int i=1;i<=n-1;i++){//n-1轮排序bool swapped=false;//优化:记录是否发生交换for(int j=1;j<=n-i;j++){//每轮比较前n-i个元素if(a[j]>a[j+1]){//相邻元素比较swap(a[j],a[j+1]);//交换swapped=true;}}if(!swapped)break;//本轮无交换说明已有序}for(int i=1;i<=n;i++)cout<<a[i]<<" ";//排序后结果return 0;
}

选择排序

#include<iostream>
using namespace std;
const int N=1e5+10;
int a[N];
int main(){int n;cin>>n;for(int i=1;i<=n;i++)cin>>a[i];//核心代码for(int i=1;i<=n-1;i++){//n-1轮选择int minn=i;//记录最小值位置for(int j=i+1;j<=n;j++){//在未排序部分找最小值if(a[j]<a[minn])minn=j;}swap(a[i],a[minn]);//把最小值放到已排序末尾}for(int i=1;i<=n;i++)cout<<a[i]<<" ";//排序后结果return 0;
}

快速排序

可以用自己写函数更改排序条件
一般配合结构体使用,下篇文章有讲到

#include<iostream>
#include<algorithm>
//sort函数必要头文件,如果不想加可以自己写sort
using namespace std;
int a[5000001];//待排序数组
int main(){int n;cin>>n;for(int i=1;i<=n;i++)cin>>a[i];sort(a+1,a+n+1);//直接调用sort函数排序[1,n]区间for(int i=1;i<=n;i++)cout<<a[i]<<" ";//排序后结果,快排是最简单的排序~return 0;
}

插入排序

#include<iostream>
using namespace std;
int a[5000001];//待排序数组
int main(){int n;cin>>n;for(int i=1;i<=n;i++)cin>>a[i];for(int i=2;i<=n;i++){//从第二个元素开始!!int key=a[i];//当前要插入的元素int j=i-1;while(j>=1&&a[j]>key){//向前找插入位置a[j+1]=a[j];//元素后移j--;}a[j+1]=key;//插入元素}for(int i=1;i<=n;i++)cout<<a[i]<<" ";//排序后结果return 0;
}

计数排序

#include<iostream>
using namespace std;
const int N=5000001;
const int K=100000;//数据范围自行调整
int a[N],cnt[K],b[N];
void csort(int n){for(int i=1;i<=n;i++)cnt[a[i]]++;for(int i=1;i<K;i++)cnt[i]+=cnt[i-1];for(int i=n;i>=1;i--)b[cnt[a[i]]--]=a[i];for(int i=1;i<=n;i++)a[i]=b[i];
}
int main(){int n;cin>>n;for(int i=1;i<=n;i++)cin>>a[i];csort(n);for(int i=1;i<=n;i++)cout<<a[i]<<" ";return 0;
}

这个注释不好写,讲一下

变量定义说明:

  • a[]:待排序数组
  • cnt[]:计数数组
  • b[]:临时存储排序结果
  • K:数据最大值范围

流程:

  • 统计每个元素出现次数(cnt[a[i]]++
  • 计算前缀和确定元素位置(cnt[i]+=cnt[i-1]
  • 反向填充保证稳定性(b[cnt[a[i]]--]=a[i]
  • 回写到原数组(a[i]=b[i]

注意事项:

  • 仅适用于非负整数排序
  • 数据范围K需要提前确定
  • 时间复杂度:O(n+K)(线性时间)

例题实战

【题目传送门】【题目传送门】【题目传送门】

P1177 【模板】排序

题目描述

将读入的 NNN 个数从小到大排序后输出。

输入格式

第一行为一个正整数 NNN

第二行包含 NNN 个空格隔开的正整数 aia_iai,为你需要进行排序的数。

输出格式

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

输入输出样例 #1

输入 #1

5
4 2 4 5 1

输出 #1

1 2 4 4 5

说明/提示

对于 20%20\%20% 的数据,有 1≤N≤1031 \leq N \leq 10^31N103

对于 100%100\%100% 的数据,有 1≤N≤1051 \leq N \leq 10^51N1051≤ai≤1091 \le a_i \le 10^91ai109

分析

简单的排序模板题,范围不大
可以直接用最简单的sortsortsort秒过
没看懂的可以看上方代码↑有注释解释
直接上代码↓

例题代码

#include <iostream>
#include <algorithm>
using namespace std;
int n,a[1000005];//数组范围10^5
int main(){cin>>n;for(int i=1;i<=n;i++)cin>>a[i];sort(a+1,a+1+n);//快排for(int i=1;i<=n;i++)cout<<a[i]<<" ";return 0;
}

题单推荐

排序⋅题单排序·题单排序题单
例题和题单来自洛谷洛谷洛谷

~ 完结撒花完结撒花完结撒花 ~

附:这篇比较简单,之前忘记讲了
之前漏了很多,把基础补回来之后再讲后面的例题
下一篇预告:递推递归或者结构体

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

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

相关文章

微服务项目中的注册中心——Nacos配置

从零开始&#xff1a;Nacos服务注册与配置中心实战教程 Nacos&#xff08;Dynamic Naming and Configuration Service&#xff09;是阿里巴巴开源的服务发现、配置管理工具&#xff0c;集注册中心与配置中心于一体&#xff0c;广泛应用于微服务架构。本文将从环境搭建到实战配…

日期格式化成英文月,必須指定語言環境

如果不指定Locale.ENGLISH 在有些JDK下 輸出6月 INV USD 314,791.77,DUE 25-07 [PAID USD 503,389.56 ON 2025-07-16]Mar INV USD 52,042.00,DUE 25-07 [PAID USD 52,042.00 ON 2025-08-11]所以必…

【6】Transformers快速入门:Transformer 的注意力层 是啥?

一句话看懂注意力层作用&#xff1a;让 AI 像人一样 “抓重点” &#xff08;比如读“猫追老鼠”&#xff0c;自动聚焦 “追” 这个动作&#xff0c;忽略无关词&#xff09;1. 为什么需要注意力&#xff1f; 问题场景&#xff08;翻译例子&#xff09;&#xff1a; 英文&#x…

集合,完整扩展

目录 前言&#xff1a; 一、List接口 1.1 ArrayList 1.2 LinkedList 1.3 Vector 二、Set接口 2.1 HashSet 2.2 TreeSet 2.3 LinkedHashSet 三、应用选择 前言&#xff1a; 本篇文章重点梳理 List 接口和 Set 接口的核心内容&#xff0c;结合代码案例帮大家吃透它们的…

【doris基础与进阶】3-Doris安装与部署

安装前的准备 在windows系统上通过vmwareubuntu 22.04的方式进行安装&#xff0c;由于资源有限&#xff0c;在同1台机器上同时安装fe和be&#xff08;broker本次不安装&#xff0c;极简化安装&#xff09;&#xff0c;安装版本为2.1.10&#xff0c;2.x版本架构不会有大的变化&a…

关于数据结构6-哈希表和5种排序算法

哈希表1哈希算法将数据通过哈希算法映射成一个键值&#xff0c;存取都在同一个位置实现数据的高效存储和查找&#xff0c;将时间复杂度尽可能降低至O(1)2哈希碰撞多个数据通过哈希算法得到的键值相同&#xff0c;成为产生哈希碰撞3哈希表&#xff1a;构建哈希表存放0-100之间的…

AWT与Swing深度对比:架构差异、迁移实战与性能优化

全面对比分析Java AWT与Swing GUI框架的架构差异、性能表现和适用场景&#xff0c;提供完整的AWT到Swing迁移实战指南&#xff0c;包含15代码示例、性能测试数据、最佳实践建议&#xff0c;助你做出明智的技术选型和实现平滑迁移。 Java AWT, Swing, GUI框架对比, 代码迁移, 性…

git仓库检测工具

介绍 Gitleaks 是一款用于检测git 仓库、文件以及任何你想通过 git 传递的信息(例如密码、API 密钥和令牌)的工具stdin。如果你想了解更多关于检测引擎工作原理的信息,请查看这篇博客:正则表达式(几乎)就是你所需要的一切。 ➜ ~/code(master) gitleaks git -v○│╲│…

【4】Transformers快速入门:自然语言模型 vs 统计语言模型

一句话关系总结 统计语言模型 自然语言模型的“数学基础” &#xff08;就像加减乘除是数学的基础&#xff0c;统计模型是AI学说话的基础工具&#xff09;区别对比表&#xff08;小白版&#xff09;维度统计语言模型自然语言模型本质用数学公式算句子概率用神经网络模仿人脑理…

[激光原理与应用-252]:理论 - 几何光学 - 传统透镜焦距固定,但近年出现的可变形透镜(如液态透镜、弹性膜透镜)可通过改变自身形状动态调整焦距。

一、液态透镜&#xff1a;电润湿效应驱动曲率变化基本结构液态透镜由两种互不相溶的液体&#xff08;如导电水溶液与绝缘硅油&#xff09;封装在透明圆筒形容器中构成。容器壁经疏水处理&#xff0c;使水溶液呈圆顶型聚集在中心&#xff0c;与硅油形成凸状曲面。工作原理电润湿…

wordpress数据库导入时的#1044错误

在wordpress网站数据库文件.sql导入到数据库时&#xff0c;发生错误&#xff0c;错误提示如下&#xff1a;#1044 – Access denied for user ‘wodepress_com’’localhost’ to database ‘wodepress’。 这个错误表明用户wodepress_com没有权限访问数据库wodepress。以下是解…

微服务ETCD服务注册和发现

1.什么是注册中心 注册中心主要有三种角色&#xff1a; 服务提供者&#xff08;RPC Server&#xff09;&#xff1a;在启动时&#xff0c;向 Registry 注册自身服务&#xff0c;并向 Registry 定期发送心跳汇报存活状态。 服务消费者&#xff08;RPC Client&#xff09;&…

计算机网络---默认网关(Default Gateway)

一、默认网关的定义 默认网关&#xff08;Default Gateway&#xff09;是一个网络设备&#xff08;通常是路由器、防火墙或三层交换机&#xff09;的IP地址&#xff0c;它是本地网络中的设备访问其他网络&#xff08;如外网、其他子网&#xff09;时&#xff0c;数据报文的“第…

OpenBMC中libgpio架构与驱动交互全解析:从硬件映射到应用控制

1. libgpio概述与核心定位 libgpio作为OpenBMC中GPIO管理的核心库&#xff0c;扮演着连接硬件驱动与上层应用的桥梁角色。它通过标准化的接口抽象了不同硬件平台的GPIO操作细节&#xff0c;使得电源控制、传感器监控等关键功能能够以统一的方式访问GPIO资源。 1.1 libgpio在Ope…

开放原子开源生态大会:麒麟信安加入openEuler社区AI联合工作组,聚焦操作系统开源实践与行业赋能

7月23日&#xff0c;由开放原子开源基金会主办的2025开放原子开源生态大会在京开幕&#xff0c;大会以“开源赋能产业&#xff0c;生态共筑未来”为主题。工业和信息化部副部长熊继军、北京市人民政府副秘书长许心超出席大会并致辞。作为开放原子开源基金会黄金捐赠人和开源重要…

Lyapunov与SAC算法的数学结构对比:从二次漂移到TD损失

一、李雅普诺夫优化中二次漂移函数的推导 李雅普诺夫优化的核心是通过设计 “李雅普诺夫函数” 和 “漂移项”&#xff0c;保证系统状态收敛到稳定点。以下以线性时不变系统为例&#xff08;非线性系统推导逻辑类似&#xff0c;仅动力学方程更复杂&#xff09;&#xff0c;推导…

WireShark:非常好用的网络抓包工具

文章目录一、写在前面二、安装三、使用1、入门使用&#xff08;1&#xff09;打开软件&#xff08;2&#xff09;右键网卡&#xff0c;Start Capture(开始捕获)2、界面详细介绍3、过滤器设置一、写在前面 Wireshark是使用最广泛的一款「开源抓包软件」&#xff0c;常用来检测网…

WEB技术演进史:从C/S到微服务架构

WEB技术 HTTP协议和B/S 结构 操作系统有进程子系统&#xff0c;使用多进程就可以充分利用硬件资源。进程中可以多个线程&#xff0c;每一个线程可以被CPU调度执行&#xff0c;这样就可以让程序并行的执行。这样一台主机就可以作为一个服务器为多个客户端提供计算服务。 客户端…

win11中Qt5.14.0+msvc2019+opencv4.9配置

本文主要研究由msvc编译的opencv在QT中的配置&#xff0c;opencv可以是官网直接下载的版本&#xff0c;也可以是msvc(例如vs2019)通过cmake编译 contrib功能的opencv版本&#xff0c;这2种版本对qt版本没有严格要求&#xff0c;但是若在cmake中选择了with_qt功能&#xff0c;那…

【listlist模拟】

list&list模拟1.list使用2、list模拟附录1.list使用 list常见接口不做介绍&#xff0c;跟前面vector有相似之处&#xff0c;跟数据结构list基本一样。  因为list使用带头的双向循环链表实现的&#xff0c;不能用小标访问&#xff0c;只能用迭代器或范围for访问 list有成…