其他分享
首页 > 其他分享> > sort

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
        比如:   
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