题目描述
利用快速排序算法将读入的 NNN 个数从小到大排序后输出。
快速排序是信息学竞赛的必备算法之一。对于快速排序不是很了解的同学可以自行上网查询相关资料,掌握后独立完成。(C++C++C++ 选手请不要试图使用 STL,虽然你可以使用 sort 一遍过,但是你并没有掌握快速排序算法的精髓。)
输入格式
第 111 行为一个正整数 NNN,第 222 行包含 NNN 个空格隔开的正整数 aia_iai,为你需要进行排序的数,数据保证了 AiA_iAi 不超过 10910^9109。
输出格式
将给定的 NNN 个数从小到大输出,数之间空格隔开,行末换行且无空格。
输入输出样例
输入 #1
5
4 2 4 5 1
输出 #1
1 2 4 4 5
说明/提示
对于 20%20%20% 的数据,有 N≤103N\leq 10^3N≤103;
对于 100%100%100% 的数据,有 N≤105N\leq 10^5N≤105。
- 这道题就是用快速排序来求解问题,这里选择一个数,我是选择数组中间的一个数,然后对两端再递归排序,这样全部就可以排好序。
- 最后,需要注意定义的i,j的大小
附代码
#include<iostream>
#include<cstdio>
using namespace std;
int str[100000+100];//定义足够大的数组,,题目说了
void f(int l,int r)
{
int mid;
mid=str[(r+l)/2];//以中间值为分割点
int i,j;
i=l;j=r;
while(i<=j)
{
while(str[i]<mid)
i++;
while(str[j]>mid)
j--;
if(i<=j)
{
int temp;
temp=str[i];
str[i]=str[j];
str[j]=temp;
i++;j--;
}
}
if(l<j)//递归两边
f(l,j);
if(i<r)
f(i,r);
// return ;
}
int main()
{
int n;
scanf("%d",&n);
int i;
for(i=1;i<=n;i++)
{
scanf("%d",&str[i]);
}
f(1,n);
for(i=1;i<=n;i++)
{
if(i==n)
printf("%d\n",str[i]);
else
printf("%d ",str[i]);
}
return 0;
}