C语言学生成绩排序算法详解:从n-1开始遍历的必要性
C语言学生成绩排序算法详解:从n-1开始遍历的必要性
这段代码使用 C 语言实现了对学生信息进行存储和排序的功能。代码中首先定义了两个结构体:SStudent 和 SStudentEx,分别用于存储学生的基本信息和成绩信息。
#include <stdio.h>
#include <math.h>
#include <string.h>
enum SEX { GIRL, BOY };
struct SStudent {
int num; //学号
char name[20]; //姓名
enum SEX sex; //性别
};
struct SStudentEx {
struct SStudent base;
float usual; //平时成绩
float mid; //期中成绩
float final; //期末成绩
float total; //学期总成绩
};
代码接着使用循环输入学生的学号、姓名、性别、平时成绩、期中成绩和期末成绩,并计算每个学生的学期总成绩。
int main() {
int n, i, j;
scanf("%d", &n);
struct SStudentEx stu[n];
for (i = 0; i < n; i++) {
scanf("%d %s %d", &stu[i].base.num, stu[i].base.name, &stu[i].base.sex);
scanf("%f %f %f", &stu[i].usual, &stu[i].mid, &stu[i].final);
stu[i].total = stu[i].usual * 0.1 + stu[i].mid * 0.2 + stu[i].final * 0.7;
}
}
随后,代码使用冒泡排序算法对学生按学期总成绩进行排序。
for (i = 0; i < n - 1; i++) {
for (j = i + 1; j < n; j++) {
if (stu[i].total < stu[j].total) {
temp = stu[i];
stu[i] = stu[j];
stu[j] = temp;
}
}
}
为什么排序算法需要从 n-1 开始遍历?
在排序过程中,每次都是将当前位置的元素与后面的元素进行比较,如果后面的元素比当前位置的元素更大,则交换它们的位置。因此,如果从 0 开始遍历,最后一个元素就没有进行比较和交换的机会,可能导致排序结果不正确。
例如,假设我们要对数组 [3, 2, 1] 进行排序。如果从 0 开始遍历,那么在第一轮比较中,3 会与 2 进行比较,然后交换位置,得到 [2, 3, 1]。接着,2 会与 1 进行比较,交换位置,得到 [1, 3, 2]。最后,3 会与 2 进行比较,但是由于 3 已经处于最后一个位置,它不会再参与比较和交换,最终导致排序结果不正确。
因此,应该从 n-1 开始遍历,确保所有元素都被比较过和交换过。
最后,代码输出排序后的学生姓名和学期总成绩。
for (i = 0; i < n; i++) {
printf("%s ", stu[i].base.name);
}
这段代码展示了使用 C 语言进行学生信息管理和排序的简单示例。通过理解排序算法中从 n-1 开始遍历的原因,我们可以更好地理解排序算法的原理和实现方式。
原文地址: https://www.cveoy.top/t/topic/nL10 著作权归作者所有。请勿转载和采集!