题目原地址:https://www.luogu.org/problem/show?pid=1177
题目描述
利用快速排序算法将读入的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。
题目简单的解法可以直接sort,但是为了更深刻的了解快排,自己手写了一下快排,可以ac挺开心的。
#include<bits/stdc++.h>
using namespace std;
int n,a[1000001],i;
void st(int a[],int l,int r)
{
int t,i=l,j=r,m=a[(l+j)/2];
while(i<=j)
{
while(a[i]<m) i++;
while(a[j]>m) j--;
if(i<=j)
t=a[i],a[i]=a[j],a[j]=t,i++,j--;
}
if(l<j) st(a,l,j);
if(r>i) st(a,i,r);
}
int main()
{
cin>>n;
for(i=0;i<n;i++)
cin>>a[i];
st(a,0,n-1);
for(i=0;i<n;i++)
i==n-1?cout<<a[i]:cout<<a[i]<<" ";
return 0;
}
试了一下,归并也可以过。
#include<bits/stdc++.h>
using namespace std;
int n,a[1000001],i,t[10000001];
void me(int a[],int first,int mid,int last,int t[])
{
int i=first,j=mid+1,n=last,m=mid,k=0;
while(j<=n&&i<=m)
{
if(a[i]>=a[j])
t[k++]=a[j++];
else
t[k++]=a[i++];
}
while(i<=m)
t[k++]=a[i++];
while(j<=n)
t[k++]=a[j++];
for(i=0;i<k;i++)
a[first+i]=t[i];
}
void mergesort(int a[],int first,int last,int t[])
{
if(first<last)
{
int m=(first+last)/2;
mergesort(a,first,m,t);//左边有序
mergesort(a,m+1,last,t);//右边有序
me(a,first,m,last,t);//将两个有序数组合并为一个
}
}
int main()
{
cin>>n;
for(i=0;i<n;i++)
cin>>a[i];
mergesort(a,0,n-1,t);
for(i=0;i<n;i++)
i==n-1?cout<<a[i]:cout<<a[i]<<" ";
return 0;
}