考研机试 2.成绩排序
时间:2021/02/21
一.题目描述
查找和排序
题目:输入任意(用户,成绩)序列,可以获得成绩从高到低或从低到高的排列,相同成绩
都按先录入排列在前的规则处理。
示例:
jack 70
peter 96
Tom 70
smith 67
从高到低 成绩
peter 96
jack 70
Tom 70
smith 67
从低到高
smith 67
jack 70
Tom 70
peter 96
输入描述
输入多行,先输入要排序的人的个数,然后输入排序方法0(降序)或者1(升序)再分别输入他们的名字和成绩,以一个空格隔开。
输出描述
按照指定方式输出名字和成绩,名字和成绩之间以一个空格隔开
题目链接
二.算法
题解
该题有多个输入块,对于每个输入块,第一行都是要排序的人数,第二行是排序的方法,之后每行由姓名和成绩组成。所以每次读取输入时都以输入块为单位进行读取,输出时也以输出块为单位进行输出。这里我们分别用names数组和scores数组来存放输入块中姓名和成绩,用相同的下标作为映射关系,所以当我们对成绩进行排序的时候也要对姓名进行相同的排序,这样就可以保证二者之间的映射关系是正确的。
代码
import java.util.Scanner; public class Main{ public static void main(String[] args){ Scanner in = new Scanner(System.in); while(in.hasNext()){ int len = in.nextInt(); int model = in.nextInt(); String[] names = new String[len]; int[] scores = new int[len]; for(int i = 0; i < len; i++){ names[i] = in.next(); scores[i] = in.nextInt(); } if(model == 0){ sortDown(names, scores, len); } else{ sortUp(names, scores, len); } for(int i = 0; i < len; i++){ System.out.println(names[i] + " " + scores[i]); } } } public static void sortDown(String[] names, int[] scores, int len){ int flag = 0; for(int i = 0; i < len - 1; i++){ for(int j = len - 1; j > i; j--){ if(scores[j] > scores[j-1]){ int temp1 = scores[j]; scores[j] = scores[j-1]; scores[j-1] = temp1; String temp2 = names[j]; names[j] = names[j-1]; names[j-1] = temp2; flag = 1; } } if(flag == 0){ break; } } } public static void sortUp(String[] names, int[] scores, int len){ int flag = 0; for(int i = 0; i < len - 1; i++){ for(int j = len - 1; j > i; j--){ if(scores[j] < scores[j-1]){ int temp1 = scores[j]; scores[j] = scores[j-1]; scores[j-1] = temp1; String temp2 = names[j]; names[j] = names[j-1]; names[j-1] = temp2; flag = 1; } } if(flag == 0){ break; } } } }
努力,向上,自律