HJ68. 成绩排序
描述
给定一些同学的信息(名字,成绩)序列,请你将他们的信息按照成绩从高到低或从低到高的排列,相同成绩
都按先录入排列在前的规则处理。
例示:
jack 70
peter 96
Tom 70
smith 67
从高到低 成绩
peter 96
jack 70
Tom 70
smith 67
从低到高
smith 67
jack 70
Tom 70输入描述
第一行输入要排序的人的个数n,第二行输入一个整数表示排序的方式,之后n行分别输入他们的名字和成绩,以一个空格隔开
输出描述
按照指定方式输出名字和成绩,名字和成绩之间以一个空格隔开
示例1
输入:
3 0 fang 90 yang 50 ning 70
输出:
fang 90 ning 70 yang 50
示例2
输入:
3 1 fang 90 yang 50 ning 70
输出:
yang 50 ning 70 fang 90
C 解法, 执行用时: 1ms, 内存消耗: 256KB, 提交时间: 2020-11-05
#include <stdio.h> #include <string.h> typedef struct { char name[50]; }test; int main() { int n,jud; while(scanf("%d",&n)!=EOF) { scanf("%d",&jud); int i,j,max=0,min=0,flag[n],orig[n]; test inp[n]; memset(flag,0,sizeof(flag)); for(i=0;i<n;i++) scanf("%s %d",&inp[i].name,&orig[i]); if(jud==0) { for(i=0;i<n;i++) { for(j=0;j<n;j++) if(orig[j]>orig[max] && flag[j]==0) max=j; flag[max]=1; printf("%s %d\n",inp[max].name,orig[max]); for(int k=0;k<n;k++) if(flag[k]==0) {max=k;break;} } } else { for(i=0;i<n;i++) { for(j=0;j<n;j++) if(orig[j]<orig[max] && flag[j]==0) max=j; flag[max]=1; printf("%s %d\n",inp[max].name,orig[max]); for(int k=0;k<n;k++) if(flag[k]==0) {max=k;break;} } } } return 0; }
C++14 解法, 执行用时: 1ms, 内存消耗: 364KB, 提交时间: 2020-09-23
#include <stdio.h> #include <string.h> struct stu { char name[20]; int grade; }; int main(){ int n, flag; while(scanf("%d %d", &n, &flag) != EOF){ stu a[n]; for(int i = 0; i<n; i++){ scanf("%s",&a[i].name); scanf("%d",&a[i].grade); } stu temp; if(flag){ for(int i=0; i<n; i++){ for(int j=0;j<n-i-1;j++){ if(a[j].grade > a[j+1].grade){ temp=a[j+1]; a[j+1]=a[j]; a[j]=temp; } } } }else{ for(int i=0; i<n; i++){ for(int j=0; j<n-i-1; j++){ if(a[j].grade < a[j+1].grade){ temp=a[j+1]; a[j+1]=a[j]; a[j]=temp; } } } } for(int i = 0; i<n; i++){ printf("%s %d\n",a[i].name, a[i].grade); } } }