比较学生的成绩和学生的名字字符排序(简述了关于字符串的字典排序的基本原理)《不建议看最开始用C语言写的,因为太复杂,建议直接看用C++写的,也没有那么难》

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define N 1000010

typedef struct {
    int numb;
    char name[50]; // 假设名字的最大长度为50
} Student;

Student st[N];

int compare(const void *a, const void *b) {
    Student *studentA = (Student *)a;
    Student *studentB = (Student *)b;

    if (studentA->numb != studentB->numb) {
        return studentB->numb - studentA->numb;
    } else {
        return strcmp(studentA->name, studentB->name);
    }
}
//这段代码是一个比较函数,用于在 `qsort` 函数中进行数组排序。让我们逐行解释每一部分的代码:
//
//1. `int compare(const void *a, const void *b) {`:
//   - `int` 表示该函数返回一个整数。
//   - `compare` 是函数的名称。
//   - `(const void *a, const void *b)` 表示该函数接受两个指向常量空间的指针作为参数,这两个指针将被转换成 `void` 类型。这种参数类型是 `qsort` 函数要求的格式。
//
//2. `Student *studentA = (Student *)a;`:
//   - 创建一个指向 `Student` 结构体的指针 `studentA`,并将参数 `a` 强制转换为 `Student` 类型的指针。这样做是为了能够使用结构体成员。
//
//3. `Student *studentB = (Student *)b;`:
//   - 同上,创建一个指向 `Student` 结构体的指针 `studentB`,并将参数 `b` 强制转换为 `Student` 类型的指针。
//
//4. `if (studentA->numb != studentB->numb) {`:
//   - 检查两个结构体的 `numb` 成员是否不相等。
//
//5. `return studentB->numb - studentA->numb;`:
//   - 如果上述条件成立,返回 `studentB->numb - studentA->numb`,即按照 `numb` 的降序排列。
//
//6. `} else {`:
//   - 如果 `if` 语句中的条件不成立,执行下面的语句块。
//
//7. `return strcmp(studentA->name, studentB->name);`:
//   - 返回通过 `strcmp` 函数比较两个结构体的 `name` 成员的结果。这样,如果 `numb` 相等,就按照 `name` 的字典顺序升序排列。
//
//8. `}`:
//   - 结束 `else` 语句块。
//
//这整个函数的目的是定义了一个比较规则,用于排序 `Student` 结构体数组。在 `qsort` 中,它将根据 `numb` 成员的降序和 `name` 成员的升序进行排序。
int main() {
    int n2 = 0;
    scanf("%d", &n2);

    for (int i = 0; i < n2; i++) {
        scanf("%s %d", st[i].name, &st[i].numb);
    }

    qsort(st, n2, sizeof(Student), compare);

    for (int k = 0; k < n2; k++) {
        printf("%s %d\n", st[k].name, st[k].numb);
    }

    return 0;
}

利用C书写比较复杂,这里使用C++进行书写(下面是利用C++编写的)

并且简单介绍一下关于字符串如何去比较字典序

这两个字符串是汉字拼音,分别对应西游记中的角色名字。在比较字典序大小时,通常是按照拼音的字母顺序进行比较。以下是这两个字符串的字母顺序比较:

1. BaiLongMa(白龙马)
2. ShaWuJing(沙悟净)

首先比较第一个字母,如果不同,较小的字符串在字典序中排在前面。如果相同,则比较第二个字母,以此类推,直到找到不同的字母或一个字符串结束。

在这两个字符串中,首字母分别是B和S,因此"BaiLongMa" 在字典序上较小,"ShaWuJing" 在字典序上较大。

再举一个例子

对于 "shilongma" 和 "shawujing" 这两个字符串,我们同样按照字母顺序进行比较:

1. **shilongma**
2. **shawujing**

首先比较第一个字母,"s" 和 "s" 相同,然后比较第二个字母,"h" 和 "h" 仍然相同,接着比较第三个字母,"i" 和 "a",发现 "i" 在字母表中较大,因此 "shilongma" 在字典序上较大,而 "shawujing" 在字典序上较小。
#include<bits/stdc++.h>
#include<iostream>
using namespace std;
const int N = 1000010;
string stud[N];
struct student
{
    student(){}
    int numb;
    string name;
}st[N];
bool cnm(student a,student b)
{
    if(a.numb != b.numb)
    {
        return a.numb > b.numb;
    }
    else
    {
        return a.name < b.name;
    }
}
int main()
{
    int n2 = 0;
    cin>>n2;
    for(int i =0; i< n2;i++)
    {
        cin>>st[i].name>>st[i].numb;
    }
    sort(st,st+n2,cnm);
    for(int k =0;k< n2;k++)
    {
        cout<<st[k].name<<" "<<st[k].numb<<endl;
    }
    return 0;
}

  • 10
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值