sort
1. sort简介:
(1)头文件 #include <algorithm>.
(2)使用的排序方法是类似于快排的方法, 时间复杂度为n*log2(n), 执行效率较高.
(3)用于C++中, 对给定区间所有元素进行排序.
2. sort函数有三个参数(第三个参数可以不写, 默认从小到大升序排列):
sort(first,last);
sort(first,last,cmp);
其中, first是元素的起始地址, last是结束地址 ( 就是需排序的数组的那部分最后一个变量的后一个地址 ), cmp是排序的方式, 类型是bool。
排序范围 [first, last)(一定要注意这里的区间是左闭又开)
区间内数据根据cmp的方式进行排序。也可以不写第三个参数, 此时按默认排序, 从小到大进行排序。
//想要从大到小也可以不用写cmp函数, 可以对数组先sort然后再rervese(头文件也是 <algorithm> )
例如
int n[]={6,9,2,3,4};
sort(n,n+5);//简单地说 数组排序结束地址 就是 数组需要排序部分的头地址 加上数组需要排序的个数
rervese(n,n+5);
3. 重载sort // 下面实例的代码中的 结构体 也可用 类(class) 代替, 都一样的
(1)自定义比较函数cmp
比如:
bool cmp(int a,int b) { return a>b;//a代表第一个前一个数, b代表后一个数, sort会把数组排序成cmp返回true的情况 //sort默认a<b; } sort(a,a+n,cmp);//如果数组定义的是int a[n+1],然后从a[1]开始存数组,最后为a[n],则写成sort(a+1,a+n+1,cmp),下面也一样;
传入的参数类型和需要排序的数据类型一致, 如果认为第一个参数需要排在第二个参数前面时返回true, 反之返回 false。
系统默认a<b时返回true, 于是从小到大排。
而上面的例子是当a大于b时,返回true。所以排序的结果就是将元素按从大到小的顺序排序。
(2)重载比较运算符“<” (在结构体内部声明)
如:
struct Student { int age; string name; struct Student friend bool operator< (Student s1,Student s2)//这里s1可以理解成左边一个数, s2为右边紧挨着的一个数 { if(s1.age==s2.age) return s1.name <s2.name;//年龄相同时, 按姓名小到大排 else return s1.age > s2.age; //从年龄大到小排序 } };
sort(a,a+n);
或
struct Student { int age; string name; bool operator<(const Student& s1)const { if(s1.age==age)//这里age可以理解成左边一个数, s1为右边紧挨着的一个数 return name<s1.name;//年龄相同时, 按姓名小到大排 else return age > s1.age; //从年龄大到小排序 } };
sort(a,a+n);
这里一定要注意一下:
参数类型如果是自定义类型, 比如自己定义的结构体, 类, 尽管sort函数默认是从小到大排列, 但是这里必须要重载比较运算符“<”
STL里的String类型 已经重载过了< , > 符号, 可以直接用 sort 排序. 和cmp函数同理, 把数组排成符合true的情况。
(3)重载比较运算符“<” (在结构体外部声明)
struct Student { int age; string name; }; struct cmp { int s; bool operator() (const Student& s1, const Student& s2) { if(s1.age==s2.age) return s1.name <s2.name;//年龄相同时, 按姓名小到大排 else return s1.age > s2.age;//从年龄大到小排序 } }; sort(a,a+n,cmp());
还是同理, 如果认为第一个参数比第二个小就返回true, 反之返回 false。
(4) functional提供了一堆基于模板的比较函数对象: equal_to<Type>、not_equal_to<Type>、greater<Type>、
greater_equal<Type>、less<Type>、less_equal<Type>。
平时排序, greater和less就足够了, 直接拿过来用:
升序: sort(begin,end,less<data-type>());//data-type是变量类型
降序: sort(begin,end,greater<data-type>())。