stl中的sort函数
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
stl中的sort函数
一、简介
STL中的sort函数是一个非常常用的算法,用于对容器中的元素进行
排序。
它可以对数组、vector、deque等容器进行排序,并且支持自
定义比较函数。
本文将详细介绍STL中的sort函数,包括其使用方法、时间复杂度、稳定性等。
二、使用方法
sort函数的使用非常简单,只需要包含头文件<algorithm>即可。
下
面是sort函数的基本语法:
```
template<class RandomAccessIterator>
void sort(RandomAccessIterator first, RandomAccessIterator last);
template<class RandomAccessIterator, class Compare>
void sort(RandomAccessIterator first, RandomAccessIterator last, Compare comp);
其中,第一个参数first和第二个参数last分别表示要排序的区间的起始位置和结束位置。
注意,这里要求传入的迭代器必须是随机访问迭
代器(Random Access Iterator),因为sort函数需要随机访问元素。
例如,对于vector<int> v来说,可以使用v.begin()和v.end()作为
参数传入sort函数。
第二个版本的sort函数还接受一个可选参数comp,表示自定义比较
函数。
如果不传入该参数,则默认使用operator<进行比较。
下面是一个示例代码:
```
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
bool cmp(int a, int b) {
return a > b;
}
int main() {
vector<int> v = {4, 2, 1, 5, 3};
sort(v.begin(), v.end()); // 默认使用operator<
for (int x : v) {
cout << x << " ";
}
cout << endl;
sort(v.begin(), v.end(), cmp); // 使用自定义比较函数
for (int x : v) {
cout << x << " ";
}
cout << endl;
return 0;
}
```
上面的示例代码中,我们首先创建了一个vector<int> v,并将其初始化为{4, 2, 1, 5, 3}。
然后,我们分别使用sort函数进行排序,第一次使用默认的operator<进行比较,第二次使用自定义的cmp函数进行比较。
最后输出排序结果。
三、时间复杂度
sort函数的时间复杂度为O(nlogn),其中n为要排序的元素个数。
这是因为sort函数采用了快速排序(Quick Sort)算法来实现。
快速排序是一种基于分治思想的高效排序算法,其平均时间复杂度为
O(nlogn),最坏情况下的时间复杂度为O(n^2)。
需要注意的是,sort函数在处理小规模数据时(通常小于16个元素)会采用插入排序(Insertion Sort)来优化性能。
插入排序虽然时间复杂度较高(最坏情况下为O(n^2),平均情况下为O(nlogn)),但对于小规模数据来说非常高效。
四、稳定性
sort函数默认是不稳定的,即在排序过程中可能会改变相等元素的相对顺序。
例如,对于{3, 2, 3, 1}这个数组进行排序,使用默认的operator<进行比较时,得到的结果可能是{1, 2, 3, 3}或者{2, 1, 3, 3}等。
这是因为快速排序算法在每一轮划分时只保证pivot左边的元素都小于等于pivot,右边的元素都大于等于pivot,而没有保证左右两边元素之间的相对顺序。
如果需要保持相等元素之间的顺序不变,则可以使用稳定排序算法
(如归并排序)或者自定义比较函数来实现。
例如,可以定义一个自定义比较函数cmp,在比较两个元素大小时先比较其值是否相等,如果相等则再比较它们在原数组中出现的位置。
下面是一个示例代码:
```
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
bool cmp(int a, int b) {
if (a == b) {
return false; // 相等则不交换
}
return a < b;
}
int main() {
vector<int> v = {3, 2, 3, 1};
stable_sort(v.begin(), v.end(), cmp); // 使用自定义比较函数
for (int x : v) {
cout << x << " ";
}
cout << endl;
return 0;
}
```
上面的示例代码中,我们使用了一个自定义比较函数cmp,在比较两个元素大小时先判断其值是否相等,如果相等则返回false,表示不交换它们的位置。
这样就可以保持相等元素之间的顺序不变。
五、总结
本文介绍了STL中的sort函数,包括其使用方法、时间复杂度、稳定性等。
sort函数是一个非常常用的算法,可以对容器中的元素进行排序,并且支持自定义比较函数。
需要注意的是,sort函数默认是不稳定的,在处理相等元素时可能会改变它们之间的相对顺序。
如果需要保持相等元素之间的顺序不变,则可以使用稳定排序算法或者自定义比较函数来实现。