介绍
今天我们将讨论在 C++ 中的 std 库中的 sort() 函数。
对于基本面而言, ** 排序是系统排序项目的任何过程,这些项目可能是序列的元素或任何 [数据结构]( / 社区 / 教程 / 数据结构 - 算法)的元素。
在 **C++**中,标准库提供了预定义和可用函数 sort()
来执行此排序操作。
std::sort() 函数在 C++ 中
C++中的std::sort()
函数是一个内置的函数,用于以特定顺序排序任何形式的数据结构,它在算法
头文件中定义。
1void sort (RandomAccessIterator first, RandomAccessIterator last, Compare comp);
在这里,该函数不会返回任何东西. 它只会更新从第一
到最后
迭代或位置的元素/元素. 第三个参数(可选) comp 必须是定义元素将被排序的 **顺序的函数。
该 sort()
函数使用一个 3折叠的混合排序技术,名为 Introsort. 它是 Quick Sort, Heap Sort 和 Insertion Sort 的组合。
使用 sort() 函数在 C++ 中对数据进行排序
现在我们已经通过了‘sort()’函数的基本知识,让我们在我们的C++程序中使用它来排序一些数据结构(例如 arrays)。
1、按上升顺序排序
如前所述,默认情况下, sort()
函数在未提到 comp
参数时将一组项目排序为 ** ascending** 顺序。
因此,对于下面的示例,我们只通过了第一
(开始)和最后
(结束)迭代来以上升顺序排列一个数组。
1#include<iostream>
2#include<algorithm>
3using namespace std;
4int main()
5{
6 //array initialisation
7 int demo[5] = {5, 4, 3, 2, 1};
8
9 int len = sizeof(demo)/sizeof(demo[0]);
10
11 cout<<"Before sorting array : ";
12 for(int i=0; i<len; i++)
13 {
14 cout<<" "<<demo[i];
15 }
16
17 std::sort(demo, demo + len);//Sorting demo array
18
19 cout<<"\n\nAfter sorting array : ";
20 for(int i=0; i<len; i++)
21 {
22 cout<<" "<<demo[i];
23 }
24 return 0;
25}
出发点:**
在这里,demo
是 first元素的地址,而(demo + len)
是给定数组的 最后元素的地址,因此,默认情况下,将 comp视为std::less<int>()
函数,则 sort()函数将数组排列为 ** ascending** 顺序。
** 注意:** std::less<int>()
函数比较两个参数,并根据第一个小于第二个参数是否返回 True或 False。
二、按下落顺序排序
我们还可以通过操纵其第三个参数来对数据结构进行排序,使用 sort()
函数以 descending 顺序排序。
在下面的代码中,我们使用了 std::greater<int>()
函数,该函数与 `std::less
1#include<iostream>
2#include<algorithm>
3using namespace std;
4int main()
5{
6 //array initialisation
7 int demo[5] = {44, 22, 55, 33, 66};
8
9 int len = sizeof(demo)/sizeof(demo[0]);
10
11 cout<<"Before sorting array : ";
12 for(int i=0; i<len; i++)
13 {
14 cout<<" "<<demo[i];
15 }
16
17 std::sort(demo, demo + len, greater<int>());//Sorting demo array
18
19 cout<<"\n\nAfter sorting array : ";
20 for(int i=0; i<len; i++)
21 {
22 cout<<" "<<demo[i];
23 }
24 return 0;
25}
我们还可以使用 lambda 函数作为 sort() 函数的第三参数,如下所示。
1#include<iostream>
2#include<algorithm>
3using namespace std;
4int main()
5{
6 //array initialisation
7 int demo[5] = {44, 22, 55, 33, 66};
8
9 int len = sizeof(demo)/sizeof(demo[0]);
10
11 cout<<"Before sorting array : ";
12 for(int i=0; i<len; i++)
13 {
14 cout<<" "<<demo[i];
15 }
16
17 std::sort(demo, demo + len, [](int &e1, int &e2){ return e1>e2; });//Sorting demo array
18
19 cout<<"\n\nAfter sorting array : ";
20 for(int i=0; i<len; i++)
21 {
22 cout<<" "<<demo[i];
23 }
24 return 0;
25}
上面的两种示例都生成相同的输出,如下所示,并成功地将演示
数组排序为 下行顺序。
出发点:**
3、用用户定义订单进行排序
「std::sort()」函数的第三参数(comp)也可以是定义顺序或排序的 用户定义函数。
应该注意的是,这个函数必须返回一个 boolean值(True
/False
)。
例如,在下面的代码片段中,我们试图根据它们在以 10(使用%
运算符)分割时产生的剩余元素来排序数组元素。
1#include<iostream>
2#include<algorithm>
3using namespace std;
4
5//our function
6bool My_func( int a, int b)
7{
8 return (a%10)<(b%10);
9}
10
11int main()
12{
13 //array initialisation
14 int demo[5] = {18, 45, 34, 92, 21};
15
16 int len = sizeof(demo)/sizeof(demo[0]);
17
18 cout<<"Before sorting array : ";
19 for(int i=0; i<len; i++)
20 {
21 cout<<" "<<demo[i];
22 }
23
24 std::sort(demo, demo + len, My_func);//Sorting demo array
25
26 cout<<"\n\nAfter sorting array : ";
27 for(int i=0; i<len; i++)
28 {
29 cout<<" "<<demo[i];
30 }
31 return 0;
32}
出发点:**
正如我们从上面的输出中可以看到的那样,演示
数组已成功地根据(element%10
)因子进行排序,使用我们的My_func()
函数。
std::sort() 在 C++ 中的复杂性
sort()
函数执行 **Nlog(N)**比较来排序 N 项,因此在最坏的情况下,它具有 **O(Nlog(N))**的复杂性。
总结一下
今天,我们了解了在C++标准库中使用和运作的 **sort()
**函数。
请注意, sort() 函数也可以用于其他数据结构,如 [矢量]( / 社区 / 教程 / 分类-a-vector-in-c-plus-plus)等。
我们建议通过我们的C + + 教程( / 社区 / 教程 / c-plus-plus)。
对于任何进一步的问题,请自由使用下面的评论。
参考
- std::sort() - C++ 文档,
- Standard Template Library (STL) in C++,
- C++ 算法图书馆