19339201706 发表于 2025-6-25 18:18:23

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




https://dajuwangluo.cn/zb_users/upload/2025/06/202506201750428926589141.jpg一、问题分析本题要求对学生的成绩进行排序,并保持相同成绩学生的原始输入顺序。这种要求被称为"稳定排序",是排序算法中的一个重要概念。二、核心算法
[*]‌数据结构设计‌:

[*]使用结构体Student存储学生信息
[*]额外添加order字段记录输入顺序
[*]‌自定义比较函数‌:

[*]cmp_asc:升序比较函数
[*]cmp_desc:降序比较函数
[*]当成绩相同时,比较原始输入顺序
[*]‌STL sort算法‌:

[*]利用C++标准库的sort函数
[*]根据用户选择传入不同的比较函数
三、关键点解析
[*]‌稳定排序实现‌:

[*]通过记录原始顺序实现稳定性
[*]比直接使用stable_sort更直观
[*]‌比较函数设计‌:

[*]先比较成绩
[*]成绩相同再比较输入顺序
[*]‌时间复杂度‌:

[*]sort算法平均O(nlogn)
[*]适合n≤200的数据规模
四、完整代码#include <iostream>
#include <vector>
#include <algorithm>
using namespACe std;

struct Student {
    string name;
    int score;
    int order;// 记录输入顺序
};

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

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

int main() {
    int n, op;
    cin >> n >> op;

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

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

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

    return 0;
}五、常见错误
[*]忘记处理相同成绩的情况
[*]比较函数逻辑错误
[*]输入顺序记录错误
扩展思考
[*]如何支持多关键字排序?
[*]如何处理大规模数据排序?
[*]如何实现自定义排序规则的通用方案?
来源:牛客网4854题:从零掌握稳定排序:学生成绩排序算法详解

页: [1]
查看完整版本: 牛客网4854题:从零掌握稳定排序:学生成绩排序算法详解