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;
}
原文地址:https://www.cnblogs.com/Potrem/p/Luogu_P1177.html