今天来做排序的题。
题目描述:
输入任意(用户,成绩)序列,可以获得成绩从高到低或从低到高的排列,相同成绩
都按先录入排列在前的规则处理。
示例:
jack 70
peter 96
Tom 70
smith 67
从高到低 成绩
peter 96
jack 70
Tom 70
smith 67
从低到高
smith 67
jack 70
Tom 70
peter 96
还记得冒泡排序是怎么写的吗:
for (i = 1; i < len; i++) {
exchange = 0;
for (j = 0; j < len - i; j++) {
if (a[j] > a[j + 1]) {
tmp = a[j];
a[j] = a[j + 1];
a[j + 1] = tmp;
exchange = 1;
}
}
if (exchange == 0)break;
}
这道题的核心思想就是排序。这一点解决了就没有很难的地方了。
只有一个小点需要注意:我在编程的时候使用的是VS,它对scanf不支持导致我在输入字符串的时候老报错。但实际上在网上平台编译的时候使用scanf函数也是没问题的。
可以看到我在下面的代码中使用了cin去输入字符串,就是因为VS的原因。如果大家用的不是VS,直接按scanf函数输入应该也是可以的。
#include<iostream>
#include<string>
#include<stdio.h>
#include<stdlib.h>
using namespace std;
#define MAXSIZE 20
typedef struct user {
char name[MAXSIZE];
int grade;
}user;
void sort(int isAsc, user* a, int len);
int main() {
int len;
int isAsc;
while (scanf("%d%d", &len, &isAsc) != EOF) {
user* users = (user*)malloc(len * sizeof(user));
for (int i = 0; i < len; i++) {
cin >> users[i].name;
scanf("%d", &users[i].grade);
}
sort(isAsc, users, len);
for (int i = 0; i < len; i++) {
printf("%s %d\n", users[i].name, users[i].grade);
}
free(users);
}
return 0;
}
void sort(int isAsc, user* a,int len) {//上面三个参数,分别是是否为升序(1为升序、0为降序)、待排序数组、数组长度
int i, j, exchange;
user tmp;
if (isAsc == 0) {
for (i = 1; i < len; i++) {
exchange = 0;
for (j = 0; j < len - i; j++) {
if (a[j].grade < a[j + 1].grade) {
tmp = a[j];
a[j] = a[j + 1];
a[j + 1] = tmp;
exchange = 1;
}
}
if (exchange == 0)break;
}
}
else if (isAsc == 1) {
for (i = 1; i < len; i++) {
exchange = 0;
for (j = 0; j < len - i; j++) {
if (a[j].grade > a[j + 1].grade) {
tmp = a[j];
a[j] = a[j + 1];
a[j + 1] = tmp;
exchange = 1;
}
}
if (exchange == 0)break;
}
}
}