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>())。
posted @ 2022-05-21 00:25  Minza  阅读(126)  评论(0编辑  收藏  举报