算法笔记第四章排序

这段代码展示了如何使用C语言结合algorithm库的sort函数对结构体数组进行排序,结构体包含学号、分数等字段。排序依据是分数降序,同分则按学号升序。同时,代码计算了每个学生的本地排名和全局排名。输入为学生数量和每个班级的学生分数,输出是学生的全局排名、本地排名、学号和本地编号。
摘要由CSDN通过智能技术生成

使用sort()函数进行排序时,输入的参数为排序开始的地址与结束地址的后一位以及(排序的方式)可以不加。
要algortthm头文件,并且using namespace std
在这里插入图片描述
实现C代码如下:

#define _CRT_SECURE_NO_WARNINGS
#include<cstdio>
#include<algorithm>
using namespace std;
struct stu {
	char id[100];
	int score;
	int local_number;
	int local_rank;
	int fin_rank;
}student[100];
bool cmp(stu a,stu b) {
	if (a.score != b.score) {
		return a.score > b.score;
	}
	else {
		return strcmp(a.id , b.id)<0;
	}
}
int main() {
	int N, K;
	int h = 0;
	int num = 0;
	int flag;
	int fin = 1;
	int count = 1;
	scanf("%d", &N);
	for (int i = 0; i < N; i++) {
		scanf("%d", &K);
		for (int j = 0; j < K; j++) {
			scanf("%s", &student[h].id);
			scanf("%d", &student[h].score);
			student[h].local_number = i+1;
			h++;
			num++;
		}
		flag = 1;
		sort(student+h-K,student+h,cmp);
		student[h - K].local_rank = 1;
		for (int m = h - K+1; m < h; m++) {
			if (student[m].score != student[m - 1].score) {
				flag+=count;
				student[m].local_rank = flag;
				count = 1;
			}
			else {
				count++;
				student[m].local_rank = flag;
			}
		}
	}
		sort(student, student+h, cmp);
		printf("%d\n", num);
		student[0].fin_rank = fin;
		printf("%s %d %d %d\n", student[0].id, student[0].fin_rank, student[0].local_number, student[0].local_rank);
		for (int n = 1; n < h; n++) {
			if (student[n].score != student[n - 1].score) {
				fin+=count;
				student[n].fin_rank = fin;
				count = 1;
			}
			else {
				count++;
				student[n].fin_rank = fin;
			}
			printf("%s %d %d %d\n", student[n].id,student[n].fin_rank, student[n].local_number,student[n].local_rank);
	}
		

	return 0;
}
  1. 结构体定义变量时不要与定义名同一个名字。
  2. 在输入学号等一长串的数字时,使用字符串形式进行存储会更好,因为可能就算是长整型也难以存完所有位数导致溢出。
  3. 本代码使用count变量来充当同分数时的同排名以及之后分数多加的部分。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值