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
相关产品推荐
相关产品推荐

