《C++算法竞赛攻略:从入门到降维打击》——第4章

第四章:排序 (Sorting)

排序,就是将一组杂乱无章的数据按照特定规则(例如,从小到大)重新排列的过程。如果你刚刚接触算法,可能会觉得排序很简单,不就是调用一个函数的事吗?然而,在算法世界里,排序被尊为“算法之母”,是每一个算法学习者必须深入理解和熟练掌握的基石。

4.1 思想:为何排序是“算法之母”

想象一下,没有排序的世界会是怎样?

  • 在一本没有按音序排列的字典里查找一个词,你可能需要从第一页翻到最后一页。
  • 想在手机通讯录里找一个联系人,如果不是按姓名首字母排列,每次查找都将是一场灾难。
  • 电商网站的商品列表,如果不能按价格、销量或好评度排序,你将很难筛选出心仪的商品。

有序,是高效的前提。

排序的本质就是为数据赋予“秩序”。一旦数据变得有序,许多看似复杂的问题便迎刃而解。

  1. 高效查找:在有序数据中,我们可以使用二分查找(见第6章)等高效算法,将查找效率从 O(N)O(N)O(N) 提升到 O(log⁡N)O(\log N)O(logN) 的级别,这是质的飞跃。
  2. 贪心算法的基础:许多贪心算法(见第5章)的第一步就是排序。例如,要安排尽可能多的会议,一个经典的贪心策略就是将所有会议按结束时间排序,然后依次选择。排序为贪心的“局部最优”决策提供了依据。
  3. 消除重复与分组:排序后,相同或相近的元素会聚集在一起,这为去重、分组、统计频率等操作提供了极大的便利。
  4. 简化问题模型:在解决几何、区间等问题时,对点或区间进行排序,往往能将问题转化为更容易处理的线性模式。

因此,排序不仅是一种独立的算法,更是解锁其他高级算法和数据结构的“钥匙”。无论问题多么复杂,当你毫无头绪时,不妨先思考一下:“如果数据是有序的,问题会变得更简单吗?”。掌握排序,就是掌握了算法世界中最强大的基本工具之一。

4.2 C++实现:sort 函数的一站式解决方案

在算法竞赛中,我们很少需要手写像冒泡排序、快速排序这样的底层实现。因为C++标准模板库(STL)已经为我们提供了一个功能强大、性能卓越的“终极武器”——std::sort 函数。

sort 函数位于 <algorithm> 头文件中,它通常采用一种名为内省排序 (IntroSort) 的混合排序算法,在最坏情况下的时间复杂度依然能保证为 O(Nlog⁡N)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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱看烟花的码农

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值