目录
一、sort
为什么一个讲 sort 的文章还要有一个篇章就叫 sort 呢?难道还有不叫 sort 的排序吗?yes!
sort 其实并不完全是用的是快速排序排集合了堆排序和插入排序,如果需要纯快排,请使用qsort。sort 会根据不同的数量级别以及不同情况,能自动选用合适的排序方法。一般快速排序一旦分段后的数据量小于某个阀值,为避免递归调用带来过大的额外负荷,便会改用插入排序。而如果递归层次过深,有出现最坏情况的倾向,还会改用堆排序。
所以无论元素初始时为何种状态,sort()
的平均排序复杂度为均为 ,具有不错的的性能。
#include <algorithm>
#include <iostream>
using namespace std;
int main()
{
int n, a[1000000005];
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 << a[i] << ' ';
}
return 0;
}
注意⚠️:请勿抄袭代码,否则将受到封号或棕名惩罚。
除了数组,对于 deque 这种可以随机访问地址的数据结构,也可以 sort 排序。
二、partial sort
我先出一道题,给全校同学的成绩,输出在全校成绩排名前10的人的成绩。排序啊! 然后如果把全校同学的成绩都排序,那未免有点太浪费了,我们可不可以只挑选出前10名的同学的成绩呢? 这时候我们就要用到 partial sort。
partial sort 有三个参数,第一个参数表示起始位置,第二个参数表示排序要排到这里,第三个参数表示终止位置,时间复杂度超快平均,平均竟然是 ,可以参考partial_sort 头文件。
三、stable sort
sort 固然不是稳定排序,如果想要稳定排序,需要手写代码:
#include <algorithm>
#include <iostream>
using namespace std;
struct stable_int
{
int num;
int id;
bool operator<(const stable_int& other) const
{
if(num < other.num)
{
return id < other.id;
}
return num < other.num;
}
}a[1000000005];
int main()
{
int n,;
cin>>n;
for (int i = 1; i <= n; i ++)
{
cin >> a[i].num;
}
sort(a + 1, a + n + 1);
for (int i = 1; i <= n; i ++)
{
cout << a[i].num << ' ';
}
return 0;
}
手写代码显然太慢,于是就有了 stable_sort,默认稳定排序,可以参考
四、merge
两个已经排好序的数组从新排序当然浪费时间,本来 的排序硬是变成了,于是就有了 merge。
merge 有足足 5 个参数,前两个参数是第一个数组的起始和结束位置,后两个参数是第二个数组的起始和结束位置,最后一个参数为结果安放的位置,可以参考
merge 头文件。
补充:
- 四个函数均可以补充一个参数,为比较函数 comp。
- 均函数均需引用 algorithm 头文件。
你学会了吗?