题目描述

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

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

输入输出格式

输入格式:

输入文件sort.in的第1行为一个正整数N,第2行包含N个空格隔开的正整数a[i],为你需要进行排序的数,数据保证了A[i]不超过1000000000。

输出格式:

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

输入输出样例

输入样例#1: 复制

5
4 2 4 5 1
输出样例#1: 复制

1 2 4 4 5

说明

对于20%的数据,有N≤1000;

对于100%的数据,有N≤100000。

分类 ------------ 内部比较排序
数据结构 --------- 数组
最差时间复杂度 ---- 每次选取的基准都是最大(或最小)的元素,导致每次只划分出了一个分区,需要进行n-1次划分才能结束递归,时间复杂度为O(n^2)
最优时间复杂度 ---- 每次选取的基准都是中位数,这样每次都均匀的划分出两个分区,只需要logn次划分就能结束递归,时间复杂度为O(nlogn)
平均时间复杂度 ---- O(nlogn)
所需辅助空间 ------ 主要是递归造成的栈空间的使用(用来保存left和right等局部变量),取决于递归树的深度,一般为O(logn),最差为O(n)
稳定性 ---------- 不稳定
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define MAXN 100010
using namespace std;
int n;
int num[MAXN];
int main(){
scanf("%d",&n);
for(int i=;i<=n;i++) scanf("%d",&num[i]);
sort(num+,num++n);
for(int i=;i<=n;i++)
cout<<num[i]<<" ";
}

sort的快速排序

分类 -------------- 内部比较排序
数据结构 ---------- 数组
最差时间复杂度 ---- O(n^2)
最优时间复杂度 ---- 如果能在内部循环第一次运行时,使用一个旗标来表示有无需要交换的可能,可以把最优时间复杂度降低到O(n)
平均时间复杂度 ---- O(n^2)
所需辅助空间 ------ O(1)
稳定性 ------------ 稳定
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define MAXN 100010
using namespace std;
int n,num[MAXN];
int main(){
scanf("%d",&n);
for(int i=;i<=n;i++) scanf("%d",&num[i]);
for(int j=;j<=n;j++)
for(int i=;i<=n-j;i++)
if(num[i]>num[i+])
swap(num[i],num[i+]);
for(int i=;i<=n;i++) cout<<num[i]<<" ";
}

冒泡排序 n^2

分类 -------------- 内部比较排序
数据结构 ---------- 数组
最差时间复杂度 ---- O(n^2)
最优时间复杂度 ---- 如果序列在一开始已经大部分排序过的话,会接近O(n)
平均时间复杂度 ---- O(n^2)
所需辅助空间 ------ O(1)
稳定性 ------------ 稳定
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define MAXN 100010
using namespace std;
int n,num[MAXN];
int l,r;
int main(){
scanf("%d",&n);
for(int i=;i<=n;i++) scanf("%d",&num[i]);
l=;r=n;
while(l<r){
for(int i=l;i<r;i++)
if(num[i]>num[i+])
swap(num[i],num[i+]);
r--;
for(int i=r;i>l;i--)
if(num[i-]>num[i])
swap(num[i],num[i-]);
l++;
}
for(int i=;i<=n;i++) cout<<num[i]<<" ";
}

改良版的冒泡排序(鸡尾酒排序)

分类 -------------- 内部比较排序
数据结构 ---------- 数组
最差时间复杂度 ---- O(n^2)
最优时间复杂度 ---- O(n^2)
平均时间复杂度 ---- O(n^2)
所需辅助空间 ------ O(1)
稳定性 ------------ 不稳定
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define MAXN 100010
using namespace std;
int n,num[MAXN];
int main(){
scanf("%d",&n);
for(int i=;i<=n;i++) scanf("%d",&num[i]);
for(int i=;i<=n;i++){
int minn=i;
for(int j=i+;j<=n;j++)
if(num[j]<num[minn])
minn=j;
if(minn!=i) swap(num[i],num[minn]);
}
for(int i=;i<=n;i++) cout<<num[i]<<" ";
}

选择排序

分类 ------------- 内部比较排序
数据结构 ---------- 数组
最差时间复杂度 ---- 最坏情况为输入序列是降序排列的,此时时间复杂度O(n^2)
最优时间复杂度 ---- 最好情况为输入序列是升序排列的,此时时间复杂度O(n)
平均时间复杂度 ---- O(n^2)
所需辅助空间 ------ O(1)
稳定性 ------------ 稳定
插入

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define MAXN 100010
using namespace std;
int n,num[MAXN];
int main(){
scanf("%d",&n);
for(int i=;i<=n;i++) scanf("%d",&num[i]);
for(int i=;i<=n;i++){
int get=num[i];
int j=i-;
while(j>=&&num[j]>get){
num[j+]=num[j];
j--;
}
num[j+]=get;
}
for(int i=;i<=n;i++) cout<<num[i]<<" ";
}

排序

分类 -------------- 内部比较排序
数据结构 ---------- 数组
最差时间复杂度 ---- O(n^2)
最优时间复杂度 ---- O(nlogn)
平均时间复杂度 ---- O(n^2)
所需辅助空间 ------ O(1)
稳定性 ------------ 稳定
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define MAXN 100010
using namespace std;
int n,num[MAXN];
int main(){
scanf("%d",&n);
for(int i=;i<=n;i++) scanf("%d",&num[i]);
for(int i=;i<=n;i++){
int get=num[i];
int l=,r=i-;
while(l<=r){
int mid=(l+r)/;
if(num[mid]>get) r=mid-;
else l=mid+;
}
for(int j=i-;j>=l;j--)
num[j+]=num[j];
num[l]=get;
}
for(int i=;i<=n;i++) cout<<num[i]<<" ";
}

二分的插入排序

分类 -------------- 内部比较排序
数据结构 ---------- 数组
最差时间复杂度 ---- O(nlogn)
最优时间复杂度 ---- O(nlogn)
平均时间复杂度 ---- O(nlogn)
所需辅助空间 ------ O(n)
稳定性 ------------ 稳定
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define MAXN 100010
using namespace std;
int n,num[MAXN],tmp[MAXN];
void up(int l,int mid,int r){
int len=r-l+;
int i=l,j=mid+,tot=;
while(i<=mid&&j<=r){
tmp[++tot]=num[i]<num[j]?num[i++]:num[j++];
}
while(i<=mid) tmp[++tot]=num[i++];
while(j<=r) tmp[++tot]=num[j++];
for(int k=;k<=tot;k++)
num[l++]=tmp[k];
}
void work1(int l,int r){
if(l==r) return ;
int mid=(l+r)/;
work1(l,mid);
work1(mid+,r);
up(l,mid,r);
}
int main(){
scanf("%d",&n);
for(int i=;i<=n;i++) scanf("%d",&num[i]);
work1(,n);//递归版本
for(int i=;i<=n;i++) cout<<num[i]<<" ";
}

递归版的归并排序

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define MAXN 100010
using namespace std;
int n,num[MAXN],tmp[MAXN];
void up(int l,int mid,int r){
int len=r-l+;
int i=l,j=mid+,tot=;
while(i<=mid&&j<=r){
tmp[++tot]=num[i]<num[j]?num[i++]:num[j++];
}
while(i<=mid) tmp[++tot]=num[i++];
while(j<=r) tmp[++tot]=num[j++];
for(int k=;k<=tot;k++)
num[l++]=tmp[k];
}
int main(){
scanf("%d",&n);
for(int i=;i<=n;i++) scanf("%d",&num[i]);
int l,r,mid;
for(int i=;i<=n;i*=){
l=;
while(l+i<=n){
mid=l+i-;
r=mid+i<=n?mid+i:n;
up(l,mid,r);
l=r+;
}
}
for(int i=;i<=n;i++) cout<<num[i]<<" ";
}

非递归版本的归并排序

分类 ------------ 内部非比较排序
数据结构 --------- 数组
最差时间复杂度 ---- O(n + k)
最优时间复杂度 ---- O(n + k)
平均时间复杂度 ---- O(n + k)
所需辅助空间 ------ O(n + k)
稳定性 ----------- 稳定
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define MAXN 100010
using namespace std;
int tmp[MAXN];
int n,maxn,num[MAXN];
int main(){
scanf("%d",&n);
for(int i=;i<=n;i++){
scanf("%d",&num[i]);
tmp[num[i]]++;
maxn=max(maxn,num[i]);
}
for(int i=;i<=maxn;i++)
while(tmp[i]){
cout<<i<<" ";
tmp[i]--;
}
}

桶排序

其他的就没有什么用了吧,等以后有时间再整理。

洛谷 P1177 【模板】快速排序(排序算法整理)的更多相关文章

  1. 洛谷.3809.[模板]后缀排序(后缀数组 倍增) & 学习笔记

    题目链接 //输出ht见UOJ.35 #include<cstdio> #include<cstring> #include<algorithm> const in ...

  2. 排序算法整理C++(初赛)

    排序算法整理 常见考点 将一个乱掉的字符串排回有序(以交换为基本操作)的最少操作,就是冒泡排序. 排序算法的稳定性 排序算法的时间复杂度 排序算法的稳定性 稳定性是指排序前两个元素a1 = a2,a1 ...

  3. 洛谷P3373 [模板]线段树 2(区间增减.乘 区间求和)

    To 洛谷.3373 [模板]线段树2 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.将某区间每一个数乘上x 3.求出某区间每一个数的和 输入输出格式 输入格 ...

  4. (排序算法整理)NEFU 30/32

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/caihongshijie6/article/details/26165093        事实上, ...

  5. 洛谷P1155 双栈排序题解(图论模型转换+二分图染色+栈)

    洛谷P1155 双栈排序题解(图论模型转换+二分图染色+栈) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1311990 原题地址:洛谷P1155 双栈排序 ...

  6. 洛谷 P1177 【模板】快速排序【13种排序模版】

    P1177 [模板]快速排序 题目描述 利用快速排序算法将读入的N个数从小到大排序后输出. 快速排序是信息学竞赛的必备算法之一.对于快速排序不是很了解的同学可以自行上网查询相关资料,掌握后独立完成.( ...

  7. 常用的 JS 排序算法整理

    关于排序算法的问题可以在网上搜到一大堆,但是纯 JS 版比较零散,之前面试的时候特意整理了一遍,附带排序效率比较. //1.冒泡排序 var bubbleSort = function(arr) { ...

  8. 洛谷P3375 [模板]KMP字符串匹配

    To 洛谷.3375 KMP字符串匹配 题目描述 如题,给出两个字符串s1和s2,其中s2为s1的子串,求出s2在s1中所有出现的位置. 为了减少骗分的情况,接下来还要输出子串的前缀数组next.如果 ...

  9. 【AC自动机】洛谷三道模板题

    [题目链接] https://www.luogu.org/problem/P3808 [题意] 给定n个模式串和1个文本串,求有多少个模式串在文本串里出现过. [题解] 不再介绍基础知识了,就是裸的模 ...

  10. 洛谷-P5357-【模板】AC自动机(二次加强版)

    题目传送门 -------------------------------------- 过年在家无聊补一下这周做的几道AC自动机的模板题 sol:AC自动机,还是要解决跳fail边产生的重复访问,但 ...

随机推荐

  1. dstat---统计磁盘,CPU,IO,等相关信息

    dstat命令是一个用来替换vmstat.iostat.netstat.nfsstat和ifstat这些命令的工具,是一个全能系统信息统计工具.与sysstat相比,dstat拥有一个彩色的界面,在手 ...

  2. ECNUOJ 2144 抗震机械制造

    抗震机械制造 Time Limit:1000MS Memory Limit:65536KBTotal Submit:312 Accepted:78 Description  为了应付可能到来的地震,E ...

  3. PatentTips - Virtualizing performance counters

    BACKGROUND Generally, the concept of virtualization in information processing systems allows multipl ...

  4. ArcGIS api for javascript——创建地图

    描述 这个示例显示ArcGIS Server的一个地图.ArcGIS Server地图是缓存的,意味着它有服务器管理员建来提升性能的一组预先渲染的切片.由于这个原因地图通过ArcGISTiledMap ...

  5. File的getPath()和getAbsolutePath()和getCanonicalPath()的差别

    这几个方法是有一次无意的发现,我当时也不知道什么意思,就百度了,查到了一些列子: 原文地址http://www.blogjava.net/dreamstone/archive/2007/08/08/1 ...

  6. 改动npm包管理器的registry为淘宝镜像(npm.taobao.org)

    起因 安装了node.安装了npm之后,官方的源实在是 太慢了! 看了看淘宝的npm镜像, http://npm.taobao.org/  居然说让我再下载一个cnpm,要不然就每次都得install ...

  7. Eclipse下面的Maven管理的SSH框架整合(Struts,Spring,Hibernate)

    搭建的环境:eclispe下面的maven web项目 Struts:    2.5.10 Spring:    4.3.8 Hibernate:   5.1.7 .Final MySQL:   5. ...

  8. shrio 登录/退出

    身份验证,即在应用中谁能证明他就是他本人.一般提供如他们的身份ID一些标识信息来表明他就是他本人,如提供身份证,用户名/密码来证明. 在shiro中,用户需要提供principals (身份)和cre ...

  9. SpringMVC中JSP取不到ModelAndView的数据原因

    自己搭的项目突然EL表达式取不到值了 不管是用 ${msg} 还是用JSTL的<c:out value="${msg}"/> 都不行 才发现犯了一个平时不会注意的错误 ...

  10. kali之获取靶机的图片和看的url

    需要用到 fping工具 用-asg参数 调查选项: -4,ipv4只能ping ipv4地址 -6——ipv6只在ping ipv6地址 -b——大小=字节数量的ping数据以字节的方式发送(默认为 ...