【机试算法学习】(一) 排序与进位制 1.成绩排序

1.成绩排序

题目链接:3375. 成绩排序 - AcWing题库

该题目关键要实现一个稳定排序

快速排序、堆排序是不稳定的排序,归并排序、冒泡排序是稳定的排序。

C++中实现的sort是不稳定的排序,stable_sort是稳定的排序。因此使用stable_sort也行。

本题我使用了简单的冒泡排序实现:

#include 
#include 
using namespace std;

const int N = 1010;
typedef struct student
{
    string name;
    int score;
}st;

st stu[N];

void copy(st& s1, st& s2)
{
    swap(s1.score, s2.score);
    swap(s1.name, s2.name);
}

//使用冒泡排序实现
void sort(int len, int op)
{
    for(int i = 0; i < len; i ++)
    {
        for(int j = len - 1; j > i; j --)
            {
                if(op == 1 && stu[j].score < stu[j - 1].score)
                    copy(stu[j], stu[j - 1]);
                else if(op == 0 && stu[j].score > stu[j - 1].score)
                    copy(stu[j], stu[j - 1]);
            }
    }
}

int main()
{
    int n, op;
    cin >> n >> op;
    
    for(int i = 0; i < n; i ++)
    {
        cin >> stu[i].name >> stu[i].score;
    }
    
    sort(n, op);
    
    for(int i = 0; i < n; i ++)
        cout << stu[i].name << " " << stu[i].score << endl;
   	return 0;
}

若采用C++的stable_sort排序,需要指定排序方式。采用重载<>运算符实现:

typedef struct student
{
    int score;
    string name;
    
    //重载小于和大于
    bool operator<(const student& s) const
    {
        return score < s.score;
    }
    
    bool operator>(const student& s) const
    {
        return score > s.score;
    }
}stu;
stu p[N];

核心的排序写法,如果是按照从大到小需要写为:

stable_sort(p, p + n, greater<stu>());

[补充]

此处:greater()相当于类T>运算符,less()同理。

调用C++库中的排序函数时,如果不写默认采用<进行排序。

于是,完整代码如下:

#include 
#include 
using namespace std;

const int N = 1010;

typedef struct student
{
    int score;
    string name;
    
    //重载小于和大于
    bool operator<(const student& s) const
    {
        return score < s.score;
    }
    
    bool operator>(const student& s) const
    {
        return score > s.score;
    }
}stu;

stu p[N];

int main()
{
    int n, op;
    cin >> n >> op;
    
    for(int i = 0; i < n; i ++)
        cin >> p[i].name >> p[i].score;
    
    if(op == 1)
        stable_sort(p, p + n);
    else
        stable_sort(p, p + n, greater<stu>());
    
    for(int i = 0; i < n; i ++)
        cout << p[i].name << " " << p[i].score << endl;
    
    return 0;
    
}

你可能感兴趣的:(机试算法学习笔记,算法,学习,排序算法)