C++ sort 函数

1. 什么是排序?

排序就是将一组数据按特定的顺序排列起来。通常我们希望将数据按从小到大(升序)或者从大到小(降序)的顺序排列。

比如,假设我们有一组数字:

  1. [5, 3, 9, 1, 4]

如果按从小到大的顺序排列,它会变成:

  1. [1, 3, 4, 5, 9]

2. C++中的 sort 函数

在 C++ 中,有一个非常有用的函数叫做 sort,它可以帮助我们对一组数据进行排序。我们可以使用这个函数对数组或容器中的元素进行排序。

sort 的基本语法

  1. #include <algorithm> // 引入这个头文件才能使用 sort 函数
  2. sort(开始位置, 结束位置);
  • 开始位置:排序范围的开始,通常是数组或容器的第一个元素。
  • 结束位置:排序范围的结束,但并不包含该位置的元素。

例子:如何对一组数字排序?

我们来看看如何使用 sort 排序一个数字数组。

  1. #include <iostream>
  2. #include <algorithm> // 必须要有这个头文件来使用 sort
  3. using namespace std;
  4. int main() {
  5. // 定义一个包含数字的数组
  6. int arr[] = {5, 3, 9, 1, 4};
  7. // 使用 sort 函数进行排序
  8. sort(arr, arr + 5); // arr 是数组,arr + 5 是数组末尾的指针
  9. // 输出排序后的数组
  10. cout << "排序后的数组是: ";
  11. for (int i = 0; i < 5; i++) {
  12. cout << arr[i] << " ";
  13. }
  14. return 0;
  15. }

输出:

  1. 排序后的数组是: 1 3 4 5 9

解释:

  • arr 是我们定义的数字数组。
  • arr + 5 表示数组的结束位置,实际上是数组最后一个元素的下一个位置。
  • sort(arr, arr + 5) 会把数组中的数字按从小到大的顺序排序。

3. 如何控制排序顺序?

默认情况下,sort 是按从小到大的顺序排序的。但是如果你想按从大到小的顺序排序,我们可以给 sort 函数提供一个比较规则

例子:按从大到小排序

  1. #include <iostream>
  2. #include <algorithm> // 必须要有这个头文件来使用 sort
  3. using namespace std;
  4. int main() {
  5. int arr[] = {5, 3, 9, 1, 4};
  6. // 使用 sort 函数按从大到小的顺序排序
  7. sort(arr, arr + 5, greater<int>()); // greater<int>() 让排序从大到小
  8. // 输出排序后的数组
  9. cout << "按从大到小排序后的数组是: ";
  10. for (int i = 0; i < 5; i++) {
  11. cout << arr[i] << " ";
  12. }
  13. return 0;
  14. }

输出:

  1. 按从大到小排序后的数组是: 9 5 4 3 1

解释:

  • greater<int>() 是 C++ 标准库提供的一个函数对象,用来让排序从大到小进行。
  • sort(arr, arr + 5, greater<int>()) 表示将数组按从大到小的顺序排序。

4. 排序时使用字符串

sort 函数不仅能排序数字,还可以排序字符串。我们来看一个例子,排序一组名字。

例子:按字母顺序排序名字

  1. #include <iostream>
  2. #include <algorithm> // 引入这个头文件来使用 sort
  3. #include <string> // 需要引入 string 头文件来使用字符串类型
  4. using namespace std;
  5. int main() {
  6. string names[] = {"Tom", "Alice", "Bob", "David"};
  7. // 使用 sort 函数按字母顺序排序
  8. sort(names, names + 4); // names 数组的开始位置和结束位置
  9. // 输出排序后的名字
  10. cout << "按字母顺序排序后的名字是: ";
  11. for (int i = 0; i < 4; i++) {
  12. cout << names[i] << " ";
  13. }
  14. return 0;
  15. }

输出:

  1. 按字母顺序排序后的名字是: Alice Bob David Tom

解释:

  • 我们使用 sort(names, names + 4) 来对字符串数组进行排序。
  • 排序的规则是字母顺序(从 A 到 Z)。

5. 排序多个数据(二维数组)

有时候我们想对一组由多个数据组成的数组进行排序,比如每个元素都是一个数组,这时可以使用自定义的比较方法来排序。

例子:排序二维数组

假设我们有一个学生成绩的二维数组,每一行代表一个学生的信息,包括名字和成绩。

  1. #include <iostream>
  2. #include <algorithm>
  3. #include <string>
  4. using namespace std;
  5. int main() {
  6. // 定义一个二维数组,包含学生的名字和成绩
  7. string students[][2] = {{"Tom", "90"}, {"Alice", "85"}, {"Bob", "95"}};
  8. // 使用 sort 函数按成绩排序
  9. sort(students, students + 3, [](string a[2], string b[2]) {
  10. return stoi(a[1]) > stoi(b[1]); // 按成绩从大到小排序
  11. });
  12. // 输出排序后的学生信息
  13. cout << "按成绩排序后的学生信息是:" << endl;
  14. for (int i = 0; i < 3; i++) {
  15. cout << students[i][0] << ": " << students[i][1] << endl;
  16. }
  17. return 0;
  18. }

输出:

  1. 按成绩排序后的学生信息是:
  2. Bob: 95
  3. Tom: 90
  4. Alice: 85

解释:

  • 我们使用了一个二维数组,其中每一行包含一个学生的名字和成绩。
  • sort(students, students + 3, [](string a[2], string b[2]) { ... }) 这行代码实现了按学生成绩排序,stoi(a[1]) 把成绩从字符串转成整数,再进行比较。

总结

  1. 排序基本原理sort 函数通过比较数据来实现排序,默认为升序排列。
  2. 如何使用 sort:通过指定数组的开始位置和结束位置,可以对一组数据进行排序。
  3. 排序规则:可以使用 greater<>() 来实现降序排序,或者自定义比较规则。
  4. 排序字符串sort 也可以用来排序字符串,默认按照字母顺序排序。
  5. 二维数组排序:可以通过自定义比较函数来对多维数组进行排序。