#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;
}