关于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 }