之前遇到排序只想着最原始的方法,诸如冒泡,选择,快速排序等等,刚刚跟大牛学会了结构体的方法来排序,这样的话以后再也不用怕成绩统计、名次排序之类的题目了。
首先头文件(基于大牛的方法,本人之后做题喜欢引入题目中常用的五个头文件)
#include
#include
定义结构体:
/*定义一个结构体*/
typedef struct Stu{
char name[10];
int id;
int score;
}stu;
注释:最后一行stu是别名。
定义排序(回调)函数:
/*定义排序函数*/
int cmp(const void *a,const void *b){
stu c = *(stu*)a;
stu d = *(stu*)b;
//printf("%d\n",strcmp(c.name,d.name));
if(strcmp(c.name,d.name)>0){/*返回值是0、1*/
return strcmp(c.name,d.name);
}
else{
if(strcmp(c.name,d.name)==0){
return c.id-d.id;
}
}
}
或者:
int cmp(const void *c,const void *d){
return *(int *)c - *(int *)d;
}
使用qsort函数:
qsort(st,n,sizeof(st[0]),cmp);
头文件:stdlib.h
用 法: void qsort(void *base,int nelem,int width,int (*fcmp)(const void *,const void *));
参数:
1 :待排序数组首地址;
2 :数组中待排序元素数量;
3 :各元素的占用空间大小;
4 :指向函数的指针,用于确定排序的顺序.
下面给出一个成绩排序程序的完整代码:
1 #include
2 #include
3 #include
4 /*定义一个结构体*/
5 typedef structStu{6 char name[10];7 intid;8 intscore;9 }stu;10 /*定义排序函数*/
11 int cmp(const void *a,const void *b){12 stu c = *(stu*)a;13 stu d = *(stu*)b;14 printf("%d\n",strcmp(c.name,d.name));15 if(strcmp(c.name,d.name)>0){16 returnstrcmp(c.name,d.name);17 }18 else{19 if(strcmp(c.name,d.name)==0){20 return c.id-d.id;21 }22 }23 }24 main(){25 intn;26 stu st[10];27 scanf("%d",&n);28 for(int i=0;i