C++ sort排序之降序、升序使用总结

时间:2022-09-13 08:22:40

一、升序

C++ sort 函数十分方便,可以对内置类型也可对自定义类型进行快速排序,内置类型的使用比较简单,下面主要讨论自定义类型的排序,一般有如下几种使用方法:

1.1 重载比较操作符

比如,我们现有一批学生,要根据他们的成绩进行升序排序,成绩如果相等则根据名字升序排序,那么我们可以如下操作:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
struct Student{
 string name;
 int grade;
 
 Student(string name, int grade) : name(name), grade(grade){}
 
 bool operator < (const Student& rhs) const{
  return grade < rhs.grade
  || (grade == rhs.grade && name < rhs.name);
 }
 
 friend void operator << (ostream& output, const Student& s){
  output << s.name << " " << s.grade << endl;
 }
};
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
int main()
{
 vector<Student> vec;
 
 vec.emplace_back("Jack", 20);
 vec.emplace_back("John", 30);
 vec.emplace_back("Amy", 20);
 vec.emplace_back("Bill", 90);
 
 cout << "Before:" << endl;
 for(auto& s : vec){
  cout << s;
 }
 
 sort(begin(vec),end(vec));
 
 cout << endl << "After:" << endl;
 for(auto& s : vec){
  cout << s;
 }
 
 return 0;
}

运行结果如下图:

C++ sort排序之降序、升序使用总结

1.2 比较函数

当然,我们也可以自己写比较函数,实现如下:

?
1
2
3
4
bool cmp(const Student& lhs, const Student& rhs){
 return lhs.grade < rhs.grade
 || (lhs.grade == rhs.grade && lhs.name < rhs.name);
}

按如下方式调用:

sort(begin(vec),end(vec), cmp);

1.3 函数对象

另外一种方式,即构造一个函数对象,抑或叫 functor,其实就是实现了重载 operator() 的一个类,代码如下:

?
1
2
3
4
5
6
struct Compare{
 bool operator()(const Student& lhs, const Student& rhs){
  return lhs.grade < rhs.grade
  || (lhs.grade == rhs.grade && lhs.name < rhs.name);
 }
};

按如下方式调用:

sort(begin(vec),end(vec), Compare());

1.4 Lambda

C++11有了 Lambda 之后,就不必再为某些小函数写具名函数了,如下使用即可:

?
1
2
3
sort(begin(vec), end(vec), [](const Student& lhs, const Student& rhs) {
                return lhs.grade < rhs.grade
                 || (lhs.grade == rhs.grade && lhs.name < rhs.name); });

二、降序

降序排序的方法与升序类似,如果采用比较函数、Lambda 或者比较函数的方式,只需要改一改比较条件就OK了,但是,如果对于Student类,我们定义了 operator < 之后,不想为了降序排序再定义一个 operator > 怎么办?两种办法!

2.1 reverse

升序排序之后,用 reverse 反转即可。

2.2 反向迭代

直接按如下方式调用即可,不用再去重载 operator >

sort(vec.rbegin(), vec.rend());

三、实例补充

对一个5位数的任意整数,求出其降序数。例如,整数是82319,则其降序数是98321。算法提示:将整数的各位数分解到一维整型数组a中,再将a数组中的元素按降序排序,最后输出a数组元素值。

试建立一个类DescendNUM,用于完成该功能。具体要求如下:

(1)私有数据成员
int n:存放5位数的整数。
int a[5]:存放其元素的降序排列值。
(2)公有成员函数
DescendNUM(int x=0):构造函数,用参数x初始化n。
void decompose ():将n的各位数分解到a数组。
void dsort():将a数组排成降序。
void show():显示元素及其降序数。
(3)在主函数中输入一个5位数的任意整数,然后定义一个DescendNUM类对象num,用上述输入的数初始化num,然后完成对该类的测试。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include "stdafx.h"
#include<iostream>
using namespace std;
class DescendNUM
{
public:
    DescendNUM(int x){ n = x;}//:构造函数,用参数x初始化n。
void decompose ();//:将n的各位数分解到a数组。
void dsort();//:将a数组排成降序。
void show();//:显示元素及其降序数。
private:
    int n;//:存放5位数的整数。
 int a[5];//:存放其元素的降序排列值。
};
 
void DescendNUM::decompose ()
{
    int i=0;
    while(n!=0)
    {
        a[i++] = n%10;
        n = n/10;
    }
}
void DescendNUM::dsort()
{
    int j,i,t;
    int num=a[0];
    for(i=0;i<4;i++)
    for(j=0;j<5;j++)
    {
        if(a[j+1]>a[j])
        {
   t=a[j+1];
         a[j+1]=a[j];
         a[j] = t;
        }
    }
}
void DescendNUM::show()
{
    int i;
    for(i=0;i<5;i++)
    {
        cout<<a[i];
    }
    cout<<endl;
}
int main()
{
    DescendNUM num(82319);
    num.decompose ();
    num.dsort();
    num.show();
    return 0;
}

 到此这篇关于C++ sort 排序(降序、升序)使用总结的文章就介绍到这了,更多相关C++降序、升序内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/zhangpiu/article/details/50564064