冒泡排序的编程与应用实现 C语言

一 、目的:

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)。

扫描二维码关注公众号,回复: 14400335 查看本文章

猜你喜欢

转载自blog.csdn.net/m0_52316372/article/details/125707653
今日推荐