【普及−】洛谷——P1177 【模板】排序

见:P1177 【模板】排序 - 洛谷

题目描述

将读入的 N 个数从小到大排序后输出。

输入格式

第一行为一个正整数 N。

第二行包含 N 个空格隔开的正整数 ai​,为你需要进行排序的数。

输出格式

将给定的 N 个数从小到大输出,数之间空格隔开,行末换行且无空格。

输入输出样例

in:
5
4 2 4 5 1

out:
1 2 4 4 5

说明/提示

对于 20% 的数据,有 1≤N≤103;

对于 100% 的数据,有 1≤N≤105,1≤ai​≤109。

STL sort 函数的使用

(自定义比较方式时,除了下文所述的比较函数仍然有其他方法,感兴趣的读者可以自行了解,此处不再赘述。)

我们设我们排序的数组为 a,

排序区间为 [l,r)(即所有满足 l≤x

且从小到大排序。则调用方法为:

sort(a+l, a+n+1);

注意,如果要使用这个函数,

你应该在头文件中加上 #include

 或者 #include (万能头文件)。


快速排序的复杂度

时间复杂度[1]

快速排序最好情况下的时间复杂度为 O(nlogn),

一般情况下的复杂度为 O(nlogn),最坏时间复杂度为 O(n2)。

如下是其证明:

根据快速排序的实现过程和如上代码可以发现,

每一次将原序列分为 3 个序列的过程的时间复杂度是 O(n)。

对于最优情况,

当每一次随机选择的都是序列的中位数时,

我们要排序的序列将被分成两个长度相差不多的两个序列。

此时时间复杂度的递推式满足 T(n)=2T(2n​)+O(n)=O(nlogn),

所以其最好情况为 O(nlogn);

对于最坏情况,

当每一次选择的都是数列的最值

(一个典型的例子就是数列已经有序),

此时除了与选定的数相等的数以外,

剩下的数仍然需要排序(一个序列为空,另一个包含了除与选定的数相等的数以外的所有数),

此时的复杂度递推式为 T(n)=T(n−1)+n=O(n2),

所以快速排序的最坏时间复杂度为 O(n2)。

由于我们每次会随机选择,所以一般情况下带随机化的快速排序复杂度不会达到 O(n2)。

在日常训练和比赛中,我们一般都认为快排的时间复杂度为 O(nlogn)

空间复杂度

由于快速排序只需要一个序列来储存序列中的数(也可以再多加几个作为辅助),

所以其空间复杂度为 O(n)。

如果进行了一些优化可以降低额外的空间复杂度,

但不影响总体的空间复杂度。

代码详情

#include 
using namespace std;
const int q=1e5+5;
int a[q];
int n;

int main() {
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	sort(a+1,a+n+1);
	for(int i=1;i<=n;i++){
		cout<

动动您来财的手指

关注+收藏+点赞

好吗

你可能感兴趣的:(信息学奥赛,C++,sort快排,算法,c++)