Alpha.622 2024-05-23 10:12 采纳率: 40%
浏览 5

排序算法的练习及应用…

现在有一组学生,每个学生的信息包含学号(char num[10]),姓名(char name[20]),成绩(int)
1、请用顺序表存储这些学生的信息;
2、在不改变原顺序表中元素顺序的情况下:(提示:传值调用,排序后结果在自定义函数中输出)
(1)请用熟悉的排序算法将这些学生的信息按成绩降序排序(减排序),输出排序结果。
< 提示:按数据项进行比较: if(L->data[j].scoredata[j+1].score) ……>
(2)请用另外一种排序算法(不能与第(1)题用同一种排序算法)将这些学生的信息按学号升序排序(增排序,注意学号为字符串),输出排序结果;
<提示: #include <string.h>
strcmp(a,b)==0 表示a,b两个字符串相等;
strcmp(a,b)<0 表示字符串a小于字符串b …… >

  • 写回答

3条回答 默认 最新

  • 关注

    按成绩降序排序采用冒泡排序,按学号排序使用选择排序。
    两个排序都单独封装了函数,代码运行示例如下:

    img

    代码:

    
    #include <stdio.h>
    #include <string.h>
    //顺序表最大容量
    #define MAXNMB 100 
    //定义学生结构体
    typedef struct _student
    {
        char num[10];
        char name[20];
        int score;
    }Student;
    
    //定义顺序表
    typedef struct _linklist
    {
        Student data[MAXNMB]; //保存所有学生信息
        int nmb; //实际人数
    }LinkList;
    
    //按成绩降序
    void SortByScore(LinkList lst)
    {
        int i, j;
        Student t;
        //冒泡排序
        for (i = 0; i < lst.nmb - 1; i++)
        {
            for (j = 0; j < lst.nmb - i - 1; j++)
            {
                if (lst.data[j].score < lst.data[j + 1].score) //前边的成绩比后面的成绩低,就交换位置
                {
                    t = lst.data[j];
                    lst.data[j] = lst.data[j + 1];
                    lst.data[j + 1] = t;
                }
            }
        }
        //输出结果
        printf("\n按成绩降序排序后:\n");
        printf("学号     姓名      成绩\n");
        for (i = 0; i < lst.nmb; i++)
        {
            printf("%s   %s    %d\n", lst.data[i].num, lst.data[i].name, lst.data[i].score);
        }
    }
    
    //按学号升序排序
    void SortByNum(LinkList lst)
    {
        int i = 0, j = 0, minindex = 0;
        Student t;
        //选择排序
        for (i = 0; i < lst.nmb -1; i++)
        {
            minindex = i;
            for (j = i + 1; j < lst.nmb; j++) //遍历i后面的,找到学号最小的
            {
                if (strcmp(lst.data[j].num, lst.data[minindex].num) < 0) //j比minindex的学号小
                    minindex = j; //更新索引
            }
            if (minindex != i)
            {
                //交换i和minindex对应的学生
                t = lst.data[i];
                lst.data[i] = lst.data[minindex];
                lst.data[minindex] = t;
            }
        }
        //输出结果
        printf("\n按学号升序排序后:\n");
        printf("学号     姓名      成绩\n");
        for (i = 0; i < lst.nmb; i++)
        {
            printf("%s    %s     %d\n", lst.data[i].num, lst.data[i].name, lst.data[i].score);
        }
    }
    
    int main()
    {
        LinkList lst;
        int i = 0;
        //初始化学生信息
        printf("请输入学生个数:");
        scanf("%d", &lst.nmb);
        for (i = 0; i < lst.nmb; i++)
        {
            printf("请输入第%d个学生的学号、姓名和成绩:", i + 1);
            scanf("%s    %s    %d", lst.data[i].num, lst.data[i].name, &lst.data[i].score);
        }
        //按成绩降序排序
        SortByScore(lst);
    
        //按学号升序排序
        SortByNum(lst);
        return 0;
    }
    
    
    评论

报告相同问题?

问题事件

  • 创建了问题 5月23日

悬赏问题

  • ¥15 如何在vue.config.js中读取到public文件夹下window.APP_CONFIG.API_BASE_URL的值
  • ¥50 浦育平台scratch图形化编程
  • ¥20 求这个的原理图 只要原理图
  • ¥15 vue2项目中,如何配置环境,可以在打完包之后修改请求的服务器地址
  • ¥20 微信的店铺小程序如何修改背景图
  • ¥15 UE5.1局部变量对蓝图不可见
  • ¥15 一共有五道问题关于整数幂的运算还有房间号码 还有网络密码的解答?(语言-python)
  • ¥20 sentry如何捕获上传Android ndk 崩溃
  • ¥15 在做logistic回归模型限制性立方条图时候,不能出完整图的困难
  • ¥15 G0系列单片机HAL库中景园gc9307液晶驱动芯片无法使用硬件SPI+DMA驱动,如何解决?