题目描述
给出N个数,你的任务就是把这n个数从小到大排序
输入
第一行一个整数,N(1<=n<=200000),表示有N个数 接下来有N行,每行一个数
输出
输出N行,表示已经排序的N个数
样例输入
5 2 3 1 4 5
样例输出
1 2 3 4 5
递归内:
先随机出mid
左指针i向右找,直到a[i]大于等于mid;
右指针反之
找完后交换(这里教大家一个小技巧,swap(a,b)代表交换)
最后判断选哪边不出界,以此选择下一层递归的部分
#include<cstdio>
#include<cmath>
#include<iomanip>
#include<stdlib.h>
using namespace std;
int n,a[200005],i,t;
void qsort(int i,int j)
{
int mid,left,right;
mid=a[rand()%(j-i)+i];//这个是随机函数
left=i;
right=j;
while(i<j)
{
while(a[i]<mid)
i++;
while(a[j]>mid)
j--;
if(i<=j)
{
t=a[i];
a[i]=a[j];
a[j]=t;
i++;
j--;
}
}
if(left<j)
qsort(left,j);
if(i<right)
qsort(i,right);
}
int main()
{
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
qsort(1,n);
for(i=1;i<=n;i++)
{
printf("%d\n",a[i]);
}
}