查看: 52|回复: 0

牛客网4854题:从零掌握稳定排序:学生成绩排序算法详解

[复制链接]
  • TA的每日心情

    昨天 16:02
  • 签到天数: 35 天

    [LV.5]常住居民I

    34

    主题

    0

    回帖

    64

    积分

    注册会员

    Rank: 2

    积分
    64
    发表于 2025-6-25 18:18:23 | 显示全部楼层 |阅读模式



    一、问题分析

    本题要求对学生的成绩进行排序,并保持相同成绩学生的原始输入顺序。这种要求被称为"稳定排序",是排序算法中的一个重要概念。

    二、核心算法
    • 数据结构设计‌:


      • 使用结构体Student存储学生信息
      • 额外添加order字段记录输入顺序

    • ‌自定义比较函数‌:


      • cmp_asc:升序比较函数
      • cmp_desc:降序比较函数
      • 当成绩相同时,比较原始输入顺序

    • ‌STL sort算法‌:


      • 利用C++标准库的sort函数
      • 根据用户选择传入不同的比较函数

    三、关键点解析
    • ‌稳定排序实现‌:


      • 通过记录原始顺序实现稳定性
      • 比直接使用stable_sort更直观

    • ‌比较函数设计‌:


      • 先比较成绩
      • 成绩相同再比较输入顺序

    • 时间复杂度‌:


      • sort算法平均O(nlogn)
      • 适合n≤200的数据规模

    四、完整代码
    1. #include <iostream>
    2. #include <vector>
    3. #include <algorithm>
    4. using namespACe std;

    5. struct Student {
    6.     string name;
    7.     int score;
    8.     int order;  // 记录输入顺序
    9. };

    10. bool cmp_asc(const Student& a, const Student& b) {
    11.     if (a.score != b.score) return a.score < b.score;
    12.     return a.order < b.order;  // 成绩相同按输入顺序
    13. }

    14. bool cmp_desc(const Student& a, const Student& b) {
    15.     if (a.score != b.score) return a.score > b.score;
    16.     return a.order < b.order;  // 成绩相同按输入顺序
    17. }

    18. int main() {
    19.     int n, op;
    20.     cin >> n >> op;

    21.     vector<Student> students(n);
    22.     for (int i = 0; i < n; i++) {
    23.         cin >> students[i].name >> students[i].score;
    24.         students[i].order = i;  // 记录原始顺序
    25.     }

    26.     // 根据排序方式选择比较函数
    27.     if (op == 1) {
    28.         sort(students.begin(), students.end(), cmp_asc);
    29.     } else {
    30.         sort(students.begin(), students.end(), cmp_desc);
    31.     }

    32.     // 输出结果
    33.     for (const auto& s : students) {
    34.         cout << s.name << " " << s.score << endl;
    35.     }

    36.     return 0;
    37. }
    复制代码
    五、常见错误
    • 忘记处理相同成绩的情况
    • 比较函数逻辑错误
    • 输入顺序记录错误

    扩展思考
    • 如何支持多关键字排序?
    • 如何处理大规模数据排序?
    • 如何实现自定义排序规则的通用方案?

    来源:牛客网4854题:从零掌握稳定排序:学生成绩排序算法详解

    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    快速回复 返回顶部 返回列表