C语言学生成绩排序算法详解:从n-1开始遍历的必要性

这段代码使用 C 语言实现了对学生信息进行存储和排序的功能。代码中首先定义了两个结构体:SStudentSStudentEx,分别用于存储学生的基本信息和成绩信息。

#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 开始遍历的原因,我们可以更好地理解排序算法的原理和实现方式。

C语言学生成绩排序算法详解:从n-1开始遍历的必要性

原文地址: https://www.cveoy.top/t/topic/nL10 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录