读入n名学生的姓名、学号、成绩,分别输出成绩最高和成绩最低学生的姓名和学号。
输入格式:每个测试输入包含1个测试用例,格式为
第1行:正整数n 第2行:第1个学生的姓名 学号 成绩 第3行:第2个学生的姓名 学号 成绩 ... ... ... 第n+1行:第n个学生的姓名 学号 成绩
其中姓名和学号均为不超过10个字符的字符串,成绩为0到100之间的一个整数,这里保证在一组测试用例中没有两个学生的成绩是相同的。
输出格式:对每个测试用例输出2行,第1行是成绩最高学生的姓名和学号,第2行是成绩最低学生的姓名和学号,字符串间有1空格。
输入样例:
3 Joe Math990112 89 Mike CS991301 100 Mary EE990830 95
输出样例:
Mike CS991301 Joe Math990112
解题思路:qsort是C语言自带的快速排序函数,使用qsort速度上会快很多
1 #include<stdio.h> 2 #include<stdlib.h> 3 4 typedef struct Student{ 5 char name[11]; 6 char num[11]; 7 int score; 8 }Student; 9 Student student[1001]; 10 11 int cmp( const void *a,const void *b) 12 { 13 14 Student *c=(Student*)a; 15 Student *d=(Student*)b; 16 return d->score-c->score; //从大到小排序 17 // return c->score-d->score; //从小到大排序 18 } 19 20 int main() 21 { 22 int n,flag; 23 int i; 24 scanf("%d",&n); 25 for( i=0; i<n; i++) 26 scanf("%s %s %d",student[i].name,student[i].num,&student[i].score); 27 qsort( student,n,sizeof(student[0]),cmp); 28 printf("%s %s\n",student[0].name,student[0].num); 29 printf("%s %s\n",student[n-1].name,student[n-1].num); 30 return 0; 31 }
以上是题目的解,是结构体的,下面再补充几个算法
对整型进行排序
1 #include<stdio.h> 2 #include<stdlib.h> 3 4 int cmp( const void *a,const void *b) 5 { 6 7 return *(int *)a - *(int *)b; //从小到大排序 8 } 9 10 int main() 11 { 12 int n; 13 int i; 14 int student[1001]; 15 scanf("%d",&n); 16 for( i=0; i<n; i++) 17 scanf("%d",&student[i]); 18 qsort( student,n,sizeof(student[0]),cmp); 19 printf("%d\n",student[0]); 20 printf("%d\n",student[n-1]); 21 return 0; 22 }
对结构体二级排序
1 struct In 2 { 3 int x; 4 int y; 5 } s[100]; 6 7 //按照x从小到大排序,当x相等时按照y从大到小排序 8 9 int cmp( const void *a, const void *b ) 10 { 11 struct In *c = (In *)a; 12 struct In *d = (In *)b; 13 if(c->x != d->x) return c->x - d->x; 14 else return d->y - c->y; 15 } 16 17 qsort(s,100,sizeof(s[0]),cmp);
对字符串进行排序
1 struct In 2 { 3 int data; 4 char str[100]; 5 } s[100]; 6 7 //按照结构体中字符串str的字典顺序排序 8 9 int cmp ( const void *a, const void *b ) 10 { 11 return strcmp( (*(In *)a)->str, (*(In *)B)->str ); 12 } 13 14 qsort(s,100,sizeof(s[0]),cmp);