题解 | 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;
}

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务