sort
作者:互联网
1. sort简介:
(1)用于C++中, 对给定区间所有元素进行排序;
(2)使用的排序方法是类似于快排的方法, 时间复杂度为n*log2(n), 执行效率较高;
(3)头文件 #include <algorithm>。
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
(1)自定义比较函数cmp
比如:
(2)重载比较运算符“<” (在结构体内部声明)
如:
参数类型如果是自定义类型, 比如自己定义的结构体, 类, 尽管sort函数默认是从小到大排列, 但是这里必须要重载比较运算符“<”
和cmp函数同理, 如果认为第一个参数比第二个小就返回true, 反之返回 false。
(3)重载比较运算符“<” (在结构体外部声明)
(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>());
降序: sort(begin,end,greater<data-type>())。
(1)用于C++中, 对给定区间所有元素进行排序;
(2)使用的排序方法是类似于快排的方法, 时间复杂度为n*log2(n), 执行效率较高;
(3)头文件 #include <algorithm>。
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
(1)自定义比较函数cmp
比如:
bool cmp(int a,int b) { return a>b;//a代表第一个前一个数, b代表后一个数, sort会把数组排序成cmp返回true的情况 //sort默认a<b; } sort(a,a+n,cmp);传入的参数类型和需要排序的数据类型一致, 如果认为第一个参数比第二个小, 也就是第一个参数需要排在第二个参数前面时返回true, 反之返回 false。系统默认a<b时返回true, 于是从小到大排。而上面的例子是当b小于a时, 认为a小于b。所以排序的结果就是将元素按从大到小的顺序排序。
(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函数默认是从小到大排列, 但是这里必须要重载比较运算符“<”
和cmp函数同理, 如果认为第一个参数比第二个小就返回true, 反之返回 false。
(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>());
降序: sort(begin,end,greater<data-type>())。
标签:sort,age,Student,排序,s1,cmp 来源: https://www.cnblogs.com/minz-io/p/16294221.html