利用快速排序算法将读入的 NN 个数从小到大排序后输出,请勿使用std::sort。
输入格式
第一行一个整数 n\ (1\le n \le 10^5)n (1≤n≤105)。
第二行 nn 个整数 a_i\ (1\le a_i \le 10^9)ai (1≤ai≤109)。
输出格式
输出一行,为 a_iai 排序后的结果。
Sample
1Input
5
4 7 1 4 6
Output
1 4 4 6 7我们已经遇到好多排序题了,并且掌握了好多种排序方法,像比较常见的比较排序,桶排序,冒泡排序,但是这几种方法的时间复杂度O(M+N)或者O(N*N),这是一个非常高的时间复杂度,如果用这几种方法会时间超限,接下来的快速排序就能在一定程度上解决这个问题,它的时间复杂度可以达到O(NlogN)。
#include<stdio.h>
int a[100001],n;//定义一个全局变量,在函数中调用
void quicksort(int b,int c)
{
int i,j,t,x;
if(b>c)
return;
x=a[b];//这里的x是基准数
i=b;
j=c;
while(i!=j)
{
while(a[j]>=x&&i<j)//先从右往左找
j--;
while(a[i]<=x&&i<j)//再从左往右找
i++;
if(i<j)
{
t=a[i];
a[i]=a[j];
a[j]=t;
}
}//归位基准数
a[b]=a[i];
a[i]=x;
quicksort(b,i-1);//利用递归继续处理左边的数
quicksort(i+1,c);//利用递归继续处理右边的数
}
int main(void)
{
int i,j,t;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%d",&a[i]);//数据的赋值
}
quicksort(1,n);//快速排序的调用
for(i=1;i<=n;i++)
{
printf("%d ",a[i]);//输出排序后的结果
}
return 0;
}
做题的时候一定要看数据范围选出适合的排序方法,才能保证不会时间超限。