给出班里某门课程的成绩单,请你按成绩从高到低对成绩单排序输出,如果有相同分数则名字字典序小的在前。
第一行为n (0 < n < 20),表示班里的学生数目;
接下来的n行,每行为每个学生的名字和他的成绩, 中间用单个空格隔开。名字只包含字母且长度不超过20,成绩为一个不大于100的非负整数。
把成绩单按分数从高到低的顺序进行排序并输出,每行包含名字和分数两项,之间有一个空格。
4 Kitty 80 Hanmeimei 90 Joey 92 Tim 28
Joey 92 Hanmeimei 90 Kitty 80 Tim 28
1 #include <iostream> 2 #include <string> //C++要用到string字符串时一定要加的头文件!! 3 using namespace std; 4 string name[20],na[20]; 5 int score[20],sc[20]; 6 void merge(int left,int right) { 7 if (left >= right) { 8 return; 9 } 10 11 int mid = (left + right) / 2; 12 merge(left, mid); 13 merge(mid + 1, right); 14 15 int i = left, j = mid + 1, k = left; 16 while (i <= mid&&j <= right) { 17 if (score[i] < score[j]) { 18 na[k] = name[j]; 19 sc[k] = score[j]; 20 k++; j++; 21 } 22 else if (score[i] > score[j]) { 23 na[k] = name[i]; 24 sc[k] = score[i]; 25 k++; i++; 26 } 27 else { 28 if (name[i] > name[j]) { 29 na[k] = name[j]; 30 sc[k] = score[j]; 31 k++; j++; 32 } 33 else { 34 na[k] = name[i]; 35 sc[k] = score[i]; 36 k++; i++; 37 } 38 } 39 } 40 while (i <= mid) { 41 na[k] = name[i]; 42 sc[k] = score[i]; 43 k++; i++; 44 } 45 while (j <= right) { 46 na[k] = name[j]; 47 sc[k] = score[j]; 48 k++; j++; 49 } 50 for (int i = left; i <= right; i++) 51 { 52 name[i] = na[i]; 53 score[i] = sc[i]; 54 } 55 } 56 int main() { 57 int number; 58 cin >> number; 59 for (int i = 0; i < number; i++) 60 { 61 cin >> name[i]; 62 cin >> score[i]; 63 } 64 merge(0,number-1); 65 for (int i = 0; i < number; i++) 66 { 67 cout << name[i] << " " << score[i] << endl; 68 } 69 return 0; 70 }
原文:https://www.cnblogs.com/zymzymzym/p/13150525.html