一 、目的:
1. 掌握常用的排序方法,并掌握 C 语言实现排序算法的方法;
2. 了解各种排序方法过程及依据原则,并掌握各种排序方法的时间复杂度和稳定性的分析方法。
二 、环境:
operating system version:Win11
CPU instruction set: x64
Integrated Development Environment:Viusal Studio 2022
三 、内容:
统计成绩
【问题描述】:给出n个学生的考试成绩表,每条信息由姓名和分数组成,利用排序算法完成以下任务:
1) 按照分数高低次序,打印出每个学生在考试中获得的名次,分数相同的为同一名次。
2) 按照名次列出每个学生的姓名和分数
【要求】学生的考试成绩需要从键盘输入数据建立,同时要设计输出格式。
四 、要求:
1) 能够采用常用的排序算法中的一种实现以上两个任务;
五 、步骤:
1.程序:
#include "stdio.h"
#include "string"
using std::string;
int main() {
string name[100];
int score[100];
int rank[100];
int num;
printf("请输入学生的总人数:\n");
scanf("%d", &num);
printf("请分别输入学生姓名和对应的分数:\n");
printf("==========================================\n");
for (int i = 1; i <= num; i++)
{
printf("请输入 学生%d 的姓名:\n", i);
scanf("%s", &name[i]);
printf("请输入 学生%d 的分数:\n", i);
scanf("%d", &score[i]);
rank[i] = i;
}
int min;
int tmp;
int i;
for (i = 1; i <= num; i++) {
for (int j = i + 1; j <= num; j++)
{
if (score[i] < score[j])
{
min = score[i];
score[i] = score[j];
score[j] = min;
tmp = rank[i];
rank[i] = rank[j];
rank[j] = tmp;
}
}
}
printf("姓名 分数 排名\n");
int n = 1;
for (i = 1; i <= num; i++)
{
int m = rank[i];
printf("%s %d", &name[m], score[i]);
printf(" %d\n", n);
if (score[i] == score[i + 1])
{
n--;
}
n++;
}
return 0;
}
2.程序结果:
程序运行,我使用的测试数据如下所示:
六 、小结:
此次是关于排序的编程与实现,我采用了冒泡排序的思想,将学生按照分数降序排序的。每一趟只能确定将一个数归位。即第一趟只能确定将末位上的数归位,第二趟只能将倒数第 2 位上的数归位,依次类推下去。如果有 n 个数进行排序,只需将 n-1 个数归位,也就是要进行 n-1 趟操作。而 “每一趟 ” 都需要从第一位开始进行相邻的两个数的比较,将较大的数放后面,比较完毕之后向后挪一位继续比较下面两个相邻的两个数大小关系,重复此步骤,直到最后一个还没归位的数。冒泡排序一共要进行(n-1)次循环,每一次循环都要进行当前n-1次比较所以一共的比较次数是:(n-1) + (n-2) + (n-3) + … + 1 = n*(n-1)/2;所以冒泡排序的时间复杂度是 O(n2)。空间复杂度就是在交换元素时那个临时变量所占的内存空间;最优的空间复杂度就是开始元素顺序已经排好了,则空间复杂度为:0;最差的空间复杂度就是开始元素逆序排序了,则空间复杂度为:O(n),平均的空间复杂度为:O(1)。