鱼C论坛

 找回密码
 立即注册
查看: 2940|回复: 3

[已解决]使用的排序算法是什么?算法的核心机制是?表达算法的代码是?

[复制链接]
发表于 2021-9-3 23:22:54 From FishC Mobile | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#include<stdio.h>
#include<string.h>
#include<stdlib.h>

#define MaxName 5
#define MaxC 20
typedef struct ListNode *List;
struct ListNode{
    char Name[MaxName];//学生姓名
    List Next;//指针域
};//链表节点
struct StudentNode{
    char Name[MaxName];//学生姓名
    int nC;//该生选课门数
    int C[MaxC];//该学生选择的课程编号
} *Student;//输入的学生信息
struct CourseNode{
    int Counter;//该课程的选课人数
    List Ptr;//链表头指针
} *Course;//课程链表的表头

int CmpName(const void *a, const void *b){//调用qsort对学生姓名按字典序排序时用到的比较函数
    return strcmp(((const struct StudentNode*)a)->Name, ((const struct StudentNode*)b)->Name);
}
void Read_and_Sort(int *N, int *K);//读入并存储输入数据,再按学生姓名排序
List NewNode(char *name);//建立链表节点
void InsertCourse(int N, int K);//按姓名倒序,将学生的选课记录插入相应链表
void Output(int K);//对K门课,输出选课学生名单

int main()
{
    int N, K;
    Read_and_Sort(&N, &K);//读入并存储输入数据,再按学生姓名排序
    InsertCourse(N, K);//按姓名倒序,将学生的选课记录插入相应链表
    Output(K);//对K门课,输出选课学生名单
    return 0;
}

void Read_and_Sort(int *N, int *K){
    scanf("%d%d\n",N, K);
    Student = malloc(sizeof(struct StudentNode)*(*N));//学生记录
    Course = malloc(sizeof(struct CourseNode)*(*K));//课程链表表头
    for(int i=0;i<(*K);i++){//初始化课程链表表头
        Course[i].Counter = 0;
        Course[i].Ptr = NULL;
    }
    for(int i=0;i<(*N);i++){//读入并存储数据
        scanf("%s %d",Student[i].Name, &Student[i].nC);
        for(int j=0;j<Student[i].nC;j++)
            scanf("%d",&Student[i].C[j]);
    }
    qsort(Student, (*N), sizeof(struct StudentNode), CmpName);//按学生姓名排序
}

List NewNode(char *name){
    List temp;
    temp = (List)malloc(sizeof(struct ListNode));
    strcpy(temp->Name, name);
    temp->Next = NULL;
    return temp;
}

void InsertCourse(int N, int K){
    List Node;
    int CourseIndex;//暂存选课编号
    for(int i=N-1;i>=0;i--)//按姓名倒序//倒着插在表头,最后插入的表头一定是字典序最前面的
        for(int j=Student[i].nC-1;j>=0;j--){//对该生选的每门课
            CourseIndex = Student[i].C[j] - 1;//记录课程编号
            Node = NewNode(Student[i].Name);//建立新节点
            Node->Next = Course[CourseIndex].Ptr;//插入链表表头
            Course[CourseIndex].Ptr = Node;
            Course[CourseIndex].Counter++;
        }
}

void Output(int K){
    List Ptr;
    for(int i=0;i<K;i++){
        printf("%d %d\n",i+1, Course[i].Counter);
        for(Ptr=Course[i].Ptr;Ptr;Ptr=Ptr->Next)
            printf("%s\n",Ptr->Name);
    }
}
最佳答案
2021-9-5 15:51:57
qsort函数C语言编译器函数库自带的排序函数。qsort 的函数原型是void qsort(void*base,size_t num,size_t width,int(__cdecl*compare)(const void*,const void*)); 是base所指数组进行排序。qsort函数包含在C 标准库 - <stdlib.h>中
compar参数指向一个比较两个元素的函数。比较函数的原型应该像下面这样。注意两个形参必须是const void *型,同时在调用compar 函数(compar实质为函数指针,这里称它所指向的函数也为compar)时,传入的实参也必须转换成const void *型。在compar函数内部会将const void *型转换成实际类型。
int compar(const void *p1, const void *p2);
如果compar返回值小于0(< 0),那么p1所指向元素会被排在p2所指向元素的左面;
如果compar返回值等于0(= 0),那么p1所指向元素与p2所指向元素的顺序不确定;
如果compar返回值大于0(> 0),那么p1所指向元素会被排在p2所指向元素的右面。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-9-3 23:23:32 From FishC Mobile | 显示全部楼层
我是一个小白
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-9-3 23:29:59 | 显示全部楼层
qsort 函数 来自c库stdlib   快排
其排序的核心机制和冒泡排序一样 是交换两个成员在数组中的位置 而达到的
而快排使用了分治 大多数情况下更快
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-9-5 15:51:57 | 显示全部楼层    本楼为最佳答案   
qsort函数C语言编译器函数库自带的排序函数。qsort 的函数原型是void qsort(void*base,size_t num,size_t width,int(__cdecl*compare)(const void*,const void*)); 是base所指数组进行排序。qsort函数包含在C 标准库 - <stdlib.h>中
compar参数指向一个比较两个元素的函数。比较函数的原型应该像下面这样。注意两个形参必须是const void *型,同时在调用compar 函数(compar实质为函数指针,这里称它所指向的函数也为compar)时,传入的实参也必须转换成const void *型。在compar函数内部会将const void *型转换成实际类型。
int compar(const void *p1, const void *p2);
如果compar返回值小于0(< 0),那么p1所指向元素会被排在p2所指向元素的左面;
如果compar返回值等于0(= 0),那么p1所指向元素与p2所指向元素的顺序不确定;
如果compar返回值大于0(> 0),那么p1所指向元素会被排在p2所指向元素的右面。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-22 23:10

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表