P1177 【模板】快速排序
P1177 【模板】快速排序
时间限制 3.00s
内存限制 125.00MB
题目描述
利用快速排序算法将读入的\(N\)个数从小到大排序后输出。
快速排序是信息学竞赛的必备算法之一。对于快速排序不是很了解的同学可以自行上网查询相关资料,掌握后独立完成。(C++选手请不要试图使用 STL
,虽然你可以使用 sort
一遍过,但是你并没有掌握快速排序算法的精髓。)
输入格式
第 1 行为一个正整数\(N\),第 2 行包含\(N\)个空格隔开的正整数\(a_i\),为你需要进行排序的数,数据保证了\(a_i\)不超过\(10^9\)。
输出格式
将给定的$N个数从小到大输出,数之间空格隔开,行末换行且无空格。
输入输出样例
输入 #1
5
4 2 4 5 1
输出 #1
1 2 4 4 5
说明/提示
对于\(20\%\)的数据,有\(N\leq 10^3\);
对于\(100\%\)的数据,有\(N\leq 10^5\)。
快速排序
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=1e5+5;
int a[N];
void quicksort(int l,int r){
int i=l,j=r,mid=a[i+j>>1];
while(i<=j){
while(a[i]<mid) ++i;
while(a[j]>mid) --j;
if(i<=j){
swap(a[i],a[j]);
++i;
--j;
}
}
if(l<j) quicksort(l,j);
if(i<r) quicksort(i,r);
}
int main(){
int n;
scanf("%d",&n);
for(int i=1;i<=n;++i) scanf("%d",&a[i]);
quicksort(1,n);
for(int i=1;i<=n;++i) printf("%d ",a[i]);
return 0;
}
归并排序
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=1e5+5;
int a[N],t[N];
void mergesort(int l,int r){
if(l==r) return;
int mid=l+r>>1;
mergesort(l,mid);
mergesort(mid+1,r);
int i=l,j=mid+1,p=l;
while(i<=mid&&j<=r){
if(a[i]>a[j])
t[p++]=a[j++];
else t[p++]=a[i++];
}
while(i<=mid) t[p++]=a[i++];
while(j<=r) t[p++]=a[j++];
for(int i=l;i<=r;++i) a[i]=t[i];
}
int main(){
int n;
scanf("%d",&n);
for(int i=1;i<=n;++i) scanf("%d",&a[i]);
mergesort(1,n);
for(int i=1;i<=n;++i) printf("%d ",a[i]);
return 0;
}