关于Sort

    Sort函数是C++ STL(Standard Template Library / 标准函数库) <algorithm>头文件中的一个排序函数,作用是将一系列数进行排序,因为它的排序方式类似于快排,且复杂度为O(NlogN),因此在多数情况下可以基本满足排序的需要,相较于自己手撸快排,使用sort函数在某些情况下也是比较好的一个选择。

 

    使用前需引入头文件

#include <algorithm>

 

基本操作说明

调用格式:sort(first, last, comp)

    参数说明:

        first : 待排序数组起始地址;

        last : 待排序数组结束地址;

        com: 排序方式,该参数是可省参数,如果省略则以升序方式排序;

 

    那么下面我们就来具体看看这个函数是如何使用的;

 

    Example 1(不使用comp参数的情况)

1 #include <iostream>
 2 #include <algorithm>
 3 using namespace std;
 4 
 5 int main() {
 6     int vec[] = { 5, 1, 9, 4, 6, 7, 2, 0, 1 };
 7     for (int i = 0; i < 9; i++)
 8         cout << vec[i] << ' ';
 9     cout << endl;
10     sort(vec, vec + 9);
11     for (int i = 0; i < 9; i++)
12         cout << vec[i] << ' ';
13     cout << endl;
14 
15     return 0;
16 }

    一段很简单的样例程序,结果也是显而易见的;

5 1 9 4 6 7 2 0 1
0 1 1 2 4 5 6 7 9

 

    上面的样例程序是在不使用参数comp的情况下进行的排序,可以看到默认是以升序排列的,那么想要进行降序排列应该如何实现?

 

    Example 2

1 #include <iostream>
 2 #include <algorithm>
 3 using namespace std;
 4 
 5 bool comp(int a, int b) {
 6     return a > b;
 7 }
 8 
 9 int main() {
10     int vec[] = { 5, 1, 9, 4, 6, 7, 2, 0, 1 };
11     for (int i = 0; i < 9; i++)
12         cout << vec[i] << ' ';
13     cout << endl;
14     sort(vec, vec + 9, comp);
15     for (int i = 0; i < 9; i++)
16         cout << vec[i] << ' ';
17     cout << endl;
18 
19     return 0;
20 }

    从以上这段样例程序中我们就可以了解到comp参数的使用方法,原来它不仅仅只是一个简单的参数,它实际上是一个比较函数,但需要注意的是comp虽然是一个函数,但是使用时不需要返回值,这是使用规则;

    那么结果当然就是以降序的方式排列元素;

5 1 9 4 6 7 2 0 1
9 7 6 5 4 2 1 1 0

 

    以上都是对sort排序的常用操作,下面再增加一个对结构体进行排序的方法;

 

    Example 3

    假设结构体S有三个成员,对结构体进行排序的规则是:先以a进行升序排序,如果a相等则以b进行降序排序,如果b相等则以c进行降序排序;

    对于这类排序实际上与正常排序并没有不同,唯一需要改变的就是comp函数部分,以下是comp函数部分:

1 bool comp(S x, S y) {
2     if (x.a != y.a) return x.a < y.a;
3     if (x.b != y.b) return x.b > y.b;
4     return x.c > y.c;
5 }

 

    针对排序规则比较复杂的结构体,这里我们用一个例子进行简单说明

    排序规则如下:总分进行降序排序,如果总分相等则以分数1进行降序排序,如果分数1相等则以序号进行升序排序;

    以下是comp函数部分:

1 bool comp(Stu x, Stu y) {
2     if (x.s1 + x.s2 > y.s1 + y.s2) return true;
3     else if (x.s1 + x.s2 == y.s1 + y.s2 && x.s1 > y.s1) return true;
4     else if (x.s1 + x.s2 == y.s1 + y.s2 && x.s1 == y.s1 && x.num < y.num) return true;
5     else return false;
6 }