关于Sort
Sort函数是C++ STL(Standard Template Library / 标准函数库) <algorithm>头文件中的一个排序函数,作用是将一系列数进行排序,因为它的排序方式类似于快排,且复杂度为O(NlogN),因此在多数情况下可以基本满足排序的需要,相较于自己手撸快排,使用sort函数在某些情况下也是比较好的一个选择。
使用前需引入头文件
#include <algorithm>
基本操作说明
调用格式:sort(first, last, comp)
参数说明:
first : 待排序数组起始地址;
last : 待排序数组结束地址;
comp : 排序方式,该参数是可省参数,如果省略则以升序方式排序;
那么下面我们就来具体看看这个函数是如何使用的;
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 }