第四章:排序 (Sorting)
排序,就是将一组杂乱无章的数据按照特定规则(例如,从小到大)重新排列的过程。如果你刚刚接触算法,可能会觉得排序很简单,不就是调用一个函数的事吗?然而,在算法世界里,排序被尊为“算法之母”,是每一个算法学习者必须深入理解和熟练掌握的基石。
4.1 思想:为何排序是“算法之母”
想象一下,没有排序的世界会是怎样?
- 在一本没有按音序排列的字典里查找一个词,你可能需要从第一页翻到最后一页。
- 想在手机通讯录里找一个联系人,如果不是按姓名首字母排列,每次查找都将是一场灾难。
- 电商网站的商品列表,如果不能按价格、销量或好评度排序,你将很难筛选出心仪的商品。
有序,是高效的前提。
排序的本质就是为数据赋予“秩序”。一旦数据变得有序,许多看似复杂的问题便迎刃而解。
- 高效查找:在有序数据中,我们可以使用二分查找(见第6章)等高效算法,将查找效率从 O(N)O(N)O(N) 提升到 O(logN)O(\log N)O(logN) 的级别,这是质的飞跃。
- 贪心算法的基础:许多贪心算法(见第5章)的第一步就是排序。例如,要安排尽可能多的会议,一个经典的贪心策略就是将所有会议按结束时间排序,然后依次选择。排序为贪心的“局部最优”决策提供了依据。
- 消除重复与分组:排序后,相同或相近的元素会聚集在一起,这为去重、分组、统计频率等操作提供了极大的便利。
- 简化问题模型:在解决几何、区间等问题时,对点或区间进行排序,往往能将问题转化为更容易处理的线性模式。
因此,排序不仅是一种独立的算法,更是解锁其他高级算法和数据结构的“钥匙”。无论问题多么复杂,当你毫无头绪时,不妨先思考一下:“如果数据是有序的,问题会变得更简单吗?”。掌握排序,就是掌握了算法世界中最强大的基本工具之一。
4.2 C++实现:sort 函数的一站式解决方案
在算法竞赛中,我们很少需要手写像冒泡排序、快速排序这样的底层实现。因为C++标准模板库(STL)已经为我们提供了一个功能强大、性能卓越的“终极武器”——std::sort 函数。
sort 函数位于 <algorithm> 头文件中,它通常采用一种名为内省排序 (IntroSort) 的混合排序算法,在最坏情况下的时间复杂度依然能保证为 O(NlogN)O(N \log N)O(NlogN),并且在各种数据分布下都有着稳定的高效表现。对于机试而言,你只需要相信:用 sort 就对了!
4.2.1 对基本类型排序
对 int, long long, double, char 等基本数据类型进行排序非常简单。
语法格式: sort(起始地址, 结束地址)
- 对于普通数组
T arr[N],排序区间是sort(arr, arr + N)。 - 对于
vector<T> vec,排序区间是sort(vec.begin(), vec.end())。
默认行为: 从小到大(升序)排序。
【代码示例1:对数组和vector进行升序排序】
#include <iostream>
#include <vector>
#include <algorithm> // 必须包含sort所在的头文件
int main() {
// 1. 对普通数组排序
int arr[] = {
4, 1, 8, 5, 2};
int n = sizeof(arr) / sizeof(int);
std::sort(arr, arr + n); // 区间是 [arr, arr + n)
std::cout << "Sorted array: ";
for (int i = 0; i < n; ++i) {
std::cout << arr[i] << " ";
}
std::cout << std::endl;
// 2. 对vector排序
std::vector<int> vec = {
4, 1, 8, 5, 2};
std::sort(vec.begin(), vec.end()); // 区间是 [vec.begin(), vec.end())
std::cout << "Sorted vector: ";
for (int x : vec) {
std::cout << x << " ";
}
std::cout << std::endl;
return 0;
}
输出:
Sorted array: 1 2 4 5 8
Sorted vector: 1 2 4 5 8
如何降序排序?
sort 函数接受第三个可选参数,用于指定自定义的比较规则。我们可以传入一个比较函数对象。C++内置了 std::greater<T>() 用于实现降序排序。
【代码示例2:降序排序】
#include <iostream>
#include <ve

最低0.47元/天 解锁文章
643

被折叠的 条评论
为什么被折叠?



