记录编号 279976 评测结果 AAAAAAAAAA
题目名称 排序测试 最终得分 100
用户昵称 GravatarHzoi_ 是否通过 通过
代码语言 C++ 运行时间 3.874 s
提交时间 2016-07-09 19:23:34 内存使用 15.55 MiB
显示代码纯文本
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<ctime>
#include<algorithm>
using namespace std;
const int maxn=2000100;
struct random{
	int a,b,c,x,MOD;
	random(){}
	void init(int m){
		srand(time(0));
		a=rand();
		b=rand();
		c=rand();
		x=rand();
		MOD=m;
	}
	int operator()(){
		x=abs((a*x*x+b*x+c))%MOD;
		return x;
	}
}rander;
void qsort(int,int);
void msort(int,int);
int n,a[maxn],c[maxn];
int main(){
#define MINE
#ifdef MINE
	freopen("sorttest.in","r",stdin);
	freopen("sorttest.out","w",stdout);
#endif
	scanf("%d",&n);
	for(int i=1;i<=n;i++)scanf("%d",&a[i]);
	rander.init(n);
	if(rand()&1)qsort(1,n);//快排归并混合排序大法好!!!
	else msort(1,n);
	for(int i=1;i<=n;i++)printf("%d ",a[i]);
	return 0;
}
inline void qsort(int l,int r){
	if(l>=r)return;
	int i=l,j=l+1;
	swap(a[l],a[(rander()%(r-l))+l+1]);
	while(j<=r){
		if(a[j]<a[l])swap(a[++i],a[j]);
		else if(a[j]==a[l]&&rand()&1)swap(a[++i],a[j]);
		j++;
	}
	swap(a[l],a[i]);
	msort(l,i-1);
	msort(i+1,r);
}
inline void msort(int s,int t){
	if(s>=t)return;
	int mid=(s+t)>>1;
	qsort(s,mid);
	qsort(mid+1,t);
	int i=s,j=mid+1,k=0;
	while(i<=mid&&j<=t){
		if(a[i]<a[j])c[k]=a[i++];
		else c[k]=a[j++];
		k++;
	}
	while(i<=mid)c[k++]=a[i++];
	while(j<=t)c[k++]=a[j++];
	for(int i=s,j=0;i<=t;i++,j++)a[i]=c[j];
}