洛谷 P1177 【模板】快速排序

120 阅读2分钟

题目描述

利用快速排序算法将读入的 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;
}