## C++中的排序函数sort的具体用法
简介
C++标准模板库(STL) 提供了强大的`std::sort`函数,用于对各种类型的容器进行排序。它基于快速排序算法的改进版本,具有高效率和稳定性。本文将详细介绍`std::sort`函数的用法,包括基本用法、自定义比较函数以及排序不同数据类型的案例。### 一、基本用法`std::sort`函数位于``头文件中,其基本语法如下:```c++
#include
#include int main() {std::vector vec = {5, 2, 8, 1, 9, 4};std::sort(vec.begin(), vec.end()); // 对vec进行升序排序// 输出排序后的结果for (int x : vec) {std::cout << x << " ";} // 输出: 1 2 4 5 8 9std::cout << std::endl;return 0;
}
````std::sort(begin, end)` 接受两个迭代器作为参数:
`begin`: 指向待排序范围起始元素的迭代器。
`end`: 指向待排序范围结束元素的迭代器(不包含`end`指向的元素)。### 二、自定义比较函数默认情况下,`std::sort`使用`<`运算符进行比较,实现升序排序。 如果需要进行降序排序或根据自定义规则排序,需要提供一个自定义比较函数作为第三个参数。#### 2.1 降序排序```c++
#include
#include bool compareDesc(int a, int b) {return a > b; // 降序比较
}int main() {std::vector vec = {5, 2, 8, 1, 9, 4};std::sort(vec.begin(), vec.end(), compareDesc); // 使用自定义比较函数进行降序排序for (int x : vec) {std::cout << x << " ";} // 输出: 9 8 5 4 2 1std::cout << std::endl;return 0;
}
```#### 2.2 根据结构体成员排序假设我们有一个结构体:```c++
struct Person {std::string name;int age;
};
```我们希望按照年龄升序排序:```c++
#include
#include
#include struct Person {std::string name;int age;
};bool compareAge(const Person& a, const Person& b) {return a.age < b.age;
}int main() {std::vector people = {{"Alice", 30}, {"Bob", 25}, {"Charlie", 35}};std::sort(people.begin(), people.end(), compareAge);for (const auto& p : people) {std::cout << p.name << " (" << p.age << ") ";} // 输出: Bob (25) Alice (30) Charlie (35)std::cout << std::endl;return 0;
}
```注意,比较函数的参数应该为`const`引用,以避免不必要的复制。### 三、排序不同数据类型`std::sort`可以用于排序各种数据类型,包括内置类型(int, float, double, char等等)和自定义类型(只要定义了`<`运算符或提供了自定义比较函数)。 例如,排序字符串:```c++
#include
#include
#include int main() {std::vector strings = {"banana", "apple", "orange", "grape"};std::sort(strings.begin(), strings.end());for (const auto& str : strings) {std::cout << str << " ";} // 输出: apple banana grape orangestd::cout << std::endl;return 0;
}
```### 四、 稳定性`std::sort`是稳定的排序算法,这意味着如果两个元素具有相同的排序值,则它们在排序后的序列中的相对顺序保持不变。 这在某些情况下非常重要,例如,如果需要先按年龄排序,再按姓名排序,稳定性就能保证在年龄相同的情况下,姓名顺序不变。### 五、 效率`std::sort`的平均时间复杂度为O(N log N),最坏情况时间复杂度为O(N^2),但这种情况比较少见。 对于大多数情况,`std::sort`的效率非常高,可以满足大多数排序需求。总而言之,`std::sort`是C++中一个功能强大且高效的排序函数,可以方便地对各种数据类型进行排序,并通过自定义比较函数实现灵活的排序规则。 理解其用法对于编写高效的C++代码至关重要。
C++中的排序函数sort的具体用法**简介**C++标准模板库(STL) 提供了强大的`std::sort`函数,用于对各种类型的容器进行排序。它基于快速排序算法的改进版本,具有高效率和稳定性。本文将详细介绍`std::sort`函数的用法,包括基本用法、自定义比较函数以及排序不同数据类型的案例。
一、基本用法`std::sort`函数位于``头文件中,其基本语法如下:```c++
include
include int main() {std::vector vec = {5, 2, 8, 1, 9, 4};std::sort(vec.begin(), vec.end()); // 对vec进行升序排序// 输出排序后的结果for (int x : vec) {std::cout << x << " ";} // 输出: 1 2 4 5 8 9std::cout << std::endl;return 0;
}
````std::sort(begin, end)` 接受两个迭代器作为参数:* `begin`: 指向待排序范围起始元素的迭代器。
* `end`: 指向待排序范围结束元素的迭代器(不包含`end`指向的元素)。
二、自定义比较函数默认情况下,`std::sort`使用`<`运算符进行比较,实现升序排序。 如果需要进行降序排序或根据自定义规则排序,需要提供一个自定义比较函数作为第三个参数。
2.1 降序排序```c++
include
include bool compareDesc(int a, int b) {return a > b; // 降序比较
}int main() {std::vector vec = {5, 2, 8, 1, 9, 4};std::sort(vec.begin(), vec.end(), compareDesc); // 使用自定义比较函数进行降序排序for (int x : vec) {std::cout << x << " ";} // 输出: 9 8 5 4 2 1std::cout << std::endl;return 0;
}
```
2.2 根据结构体成员排序假设我们有一个结构体:```c++
struct Person {std::string name;int age;
};
```我们希望按照年龄升序排序:```c++
include
include
include struct Person {std::string name;int age;
};bool compareAge(const Person& a, const Person& b) {return a.age < b.age;
}int main() {std::vector people = {{"Alice", 30}, {"Bob", 25}, {"Charlie", 35}};std::sort(people.begin(), people.end(), compareAge);for (const auto& p : people) {std::cout << p.name << " (" << p.age << ") ";} // 输出: Bob (25) Alice (30) Charlie (35)std::cout << std::endl;return 0;
}
```注意,比较函数的参数应该为`const`引用,以避免不必要的复制。
三、排序不同数据类型`std::sort`可以用于排序各种数据类型,包括内置类型(int, float, double, char等等)和自定义类型(只要定义了`<`运算符或提供了自定义比较函数)。 例如,排序字符串:```c++
include
include
include int main() {std::vector strings = {"banana", "apple", "orange", "grape"};std::sort(strings.begin(), strings.end());for (const auto& str : strings) {std::cout << str << " ";} // 输出: apple banana grape orangestd::cout << std::endl;return 0;
}
```
四、 稳定性`std::sort`是稳定的排序算法,这意味着如果两个元素具有相同的排序值,则它们在排序后的序列中的相对顺序保持不变。 这在某些情况下非常重要,例如,如果需要先按年龄排序,再按姓名排序,稳定性就能保证在年龄相同的情况下,姓名顺序不变。
五、 效率`std::sort`的平均时间复杂度为O(N log N),最坏情况时间复杂度为O(N^2),但这种情况比较少见。 对于大多数情况,`std::sort`的效率非常高,可以满足大多数排序需求。总而言之,`std::sort`是C++中一个功能强大且高效的排序函数,可以方便地对各种数据类型进行排序,并通过自定义比较函数实现灵活的排序规则。 理解其用法对于编写高效的C++代码至关重要。