题解 | EXCEL排序
EXCEL排序
https://www.nowcoder.com/practice/bf3ec474bb7d410dbb9d5bbcd07a93e5
#include <stdio.h>
#include <string.h>
#define dataLen 100000
int merge(char num[dataLen][7], char name[dataLen][9], int score[dataLen],
int start, int mid, int end, int c) {
char result_num[dataLen][7];
char result_name[dataLen][9];
int result_score[dataLen];
int k = 0;
int i = start;
int j = mid + 1;
while (i <= mid && j <= end) {
int compare = 0;
if (c == 1) {
// 学号排序
compare = strcmp(num[i], num[j]) > 0;
} else if (c == 2) {
// 姓名排序
int nameCmp = strcmp(name[i], name[j]);
if (nameCmp != 0) {
compare = nameCmp > 0; // 姓名大的排后面(升序需求)
} else {
compare = strcmp(num[i], num[j]) > 0; // 姓名相同,学号大的排后面
}
} else if (c == 3) {
// 成绩排序
if (score[i] != score[j]) {
compare = score[i] > score[j]; // 成绩大的排后面(升序需求)
} else {
compare = strcmp(num[i], num[j]) > 0; // 成绩相同,学号大的排后面
}
}
if (compare) {
strcpy(result_num[k], num[j]);
strcpy(result_name[k], name[j]);
result_score[k] = score[j];
k++;
j++;
} else {
strcpy(result_num[k], num[i]);
strcpy(result_name[k], name[i]);
result_score[k] = score[i];
k++;
i++;
}
}
// 处理剩余的结果
if (i <= mid) {
while (i <= mid) {
strcpy(result_num[k], num[i]);
strcpy(result_name[k], name[i]);
result_score[k] = score[i];
k++;
i++;
}
}
if (j <= end) {
while (j <= mid) {
strcpy(result_num[k], num[j]);
strcpy(result_name[k], name[j]);
result_score[k] = score[j];
k++;
j++;
}
}
// 复制结果
for (i = start, j = 0; j < k; i++, j++) {
strcpy(num[i], result_num[j]);
strcpy(name[i], result_name[j]);
score[i] = result_score[j];
}
return 0;
}
int mergeSort(char num[dataLen][7], char name[dataLen][9], int score[dataLen],
int start, int end, int c) {
if (start >= end)
return 0;
int mid = (start + end) / 2;
mergeSort(num, name, score, start, mid, c);
mergeSort(num, name, score, mid + 1, end, c);
merge(num, name, score, start, mid, end, c);
return 0;
}
int main() {
int n, c;
char num[dataLen][7];
char name[dataLen][9];
int score[dataLen];
while (scanf("%d %d", &n, &c) != EOF && n != 0) {
for (int i = 0; i < n; i++) {
scanf("%s %s %d", num[i], name[i], &score[i]);
}
// 排序
mergeSort(num, name, score, 0, n - 1, c);
// 输出结果
printf("Case:\n");
for (int i = 0; i < n; i++) {
printf("%s %s %d\n", num[i], name[i], score[i]);
}
}
return 0;
}
查看8道真题和解析