ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

sort

2022-05-21 00:31:22  阅读:160  来源: 互联网

标签:sort age Student 排序 s1 cmp


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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有