You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言linked list的Merge sort问题:无法实现二级排序

链表归并排序实现二级排序的问题修正

问题描述

原始链表数据:

13 FRANCE 3 MAIGNAN
30 GHANA 19 SULEMANA
1 QATAR 11 KARIM
30 GHANA 11 KUDUS
13 FRANCE 7 KOUNDE

期望排序结果(先按球队编码升序,再按球员号码升序):

1 QATAR 11 KARIM
13 FRANCE 3 MAIGNAN
13 FRANCE 7 KOUNDE
30 GHANA 11 KUDUS
30 GHANA 19 SULEMANA

当前错误排序结果(同球队编码下球员号码未升序):

1 QATAR 11 KARIM
13 FRANCE 3 MAIGNAN
13 FRANCE 7 KOUNDE
30 GHANA 19 SULEMANA
30 GHANA 11 KUDUS

修正方案

问题出在归并排序的节点比较逻辑上,你目前只比较了球队编码,未处理同编码下的球员号码排序。

核心修改:调整比较函数

假设你的链表节点结构定义如下:

typedef struct Node {
    int team_code;
    char team_name[20];
    int player_num;
    char player_name[20];
    struct Node* next;
} Node;

修改归并排序中合并阶段的比较逻辑,遵循「先球队编码升序,编码相同则按球员号码升序」的规则:

// 合并两个有序链表的函数
Node* merge(Node* left, Node* right) {
    Node dummy;
    Node* tail = &dummy;
    dummy.next = NULL;

    while (left != NULL && right != NULL) {
        // 先比较球队编码,编码相等时再比较球员号码
        if (left->team_code < right->team_code || 
            (left->team_code == right->team_code && left->player_num < right->player_num)) {
            tail->next = left;
            left = left->next;
        } else {
            tail->next = right;
            right = right->next;
        }
        tail = tail->next;
    }

    // 拼接剩余未处理的节点
    if (left != NULL) tail->next = left;
    if (right != NULL) tail->next = right;

    return dummy.next;
}

关键说明

  • 所有涉及节点比较的环节(比如归并排序分割后的合并逻辑)都要遵循这个优先级规则;
  • 确保比较逻辑严格按照「升序」判断:数值小的节点排在前面,相等则进入下一级比较。

修改后,同球队编码的节点会自动按球员号码升序排列,即可得到预期的排序结果。


内容的提问来源于stack exchange,提问作者THIAGO GUIMARAES BELEM

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 14:25:15