sort(v.begin(),v.end(),cmp),它是用来对一组序列进行排序的。sort函数进行排序的时间复杂度为n*log2n,比冒泡之类的排序算法效率要高,包含在头文件为#include
其有三个参数,前两个参数是待排序区间;第三个参数可有可无(第三个参数代表比较规则),没有第三个参数的时候,sort()默认按升序排列,有第三个参数的时候,可以通过这个参数实现各种各样的排序,包括降序。sort()函数功能强大就是强大在第三个参数。
sort()函数除了可以对int型、char型、double型、字符串排序外,还可以实现对结构体、链表、pair、vector、等类型进行排序,但需要自己写比较函数。而且sort()既可以对数组排序,也可以对vector容器排序。下面就先说一下sort()只有两个参数时的用法,具体代码见下:
1 #include
2 #include
3 #include
4 #include
5 using namespace std;
6 int main()
7 {
8 int a[10]={6,5,4,8,3,9,7,10,1,2};
9 char b[8]={'h','z','l','n','m','r','d','g'};
10 vector v1;
11 vector v2;
12
27 sort(a+1,a+9); //可以指定任意合法的排序区间,不能越界
30
35 sort(b,b+8); //对整个b排序
38
43 sort(v1.begin(),v1.end());//输入两个迭代器从而排序一个范围
46
51 sort(v2.begin(),v2.end());
55 return 0;
56 }
上面几种方法都是升序排列,要想按降序排列,有3种方法可以实现:
27 sort(a+1,a+9); //可以指定任意合法的排序区间,不能越界
31 reverse(a+1,a+9);
39 sort(b,b+8); //对整个b排序
43 reverse(b,b+8);
46
51 sort(v1.begin(),v1.end());
55 reverse(v1.begin(),v1.end());
63 sort(v2.begin(),v2.end());
67 reverse(v2.begin(),v2.end());
14 sort(a,a+10,greater());//降序排列
19 sort(a,a+10,less());//升序排列
这就是sort()函数功能强大的地方,它可以扩展,而扩展的关键就是第三个参数。
先说一下比较函数,当你想实现特定比较方式的时候,就要自己定义一个返回bool值的比较函数了;这时sort()函数的第三个参数就是一个函数,如果它返回假值就交换操作对象的位置,返回真值的话操作对象位置不变。下面就用比较函数来实现升序降序的排列:
首先实现比较函数,注意比较函数参数数据类型要与需要比较的对象一致:
5 bool cmp1(int a,int b) //按降序排列
6 {
7 return a>b;
8 }
9
10 bool cmp2(int a,int b) //按升序排列
11 {
12 return a
然后调用sort函数即可,此时不需要给比较函数传入参数,比较函数只是确定比较的规则。
23 sort(v.begin(),v.end(),cmp1); //这里不需要对比较函数cmp1传入参数
28 sort(v.begin(),v.end(),cmp2); 不需要对比较函数cmp2传入参数
另外比较函数可以用lambda表达式来写,这是leetcode hot100的一道题:
首先需要对people的vector按照hi进行从小到大的升序排列,对于相同的hi再按照ki进行从大到小的降序排序,我们使用sort中第三个参数的强大功能,就能够自己定义比较规则,一条语句就能实现我们需要的排序。代码如下:
//排序,方法使用lambda表达式
sort(people.begin(), people.end(), [](vector& a, vector& b) -> bool {return (a[0] < b[0]) || ((a[0] == b[0]) && (a[1] > b[1])); });
lambda表达式详见https://www.cnblogs.com/jimodetiantang/p/9016826.html
可以定义创建匿名函数对象,从而简化编程工作。
这就是sort函数的强大之处,在我们平时的编程当中也会经常使用到。