检查归并排序稳定性,不能把相等记录当成无法区分的两个数字。常见连续左右分段、两段都已稳定排好时,归并相等项应先取左边。知英教育给每条记录增加仅用于追踪的字母,让数值有序和原次序保留分别可见。

比较数字,不把身份标签当成第二个键

自编原序列[2A,1B,2C,1D],数字是唯一排序关键字,字母表示记录身份,不参与比较。原来两个1是B在D前,两个2是A在C前;稳定的升序结果应为[1B,1D,2A,2C]。如果把数字和字母一起排序,已经改变比较规则,不能用它证明只按数字排序的过程稳定。

排好两段后,跟踪两次平局

从中间连续分成[2A,1B]和[2C,1D],两段分别排好得到左[1B,2A]、右[1D,2C]。第一次比较1B与1D,相等取左边1B;随后1D小于2A,取1D;再比较2A与2C,相等取左边2A,最后接2C。完整输出是[1B,1D,2A,2C]。

知英教育建议在每次平局处圈出身份。归并排序稳定性依赖的不只是“先取左边”:左半段原本整体早于右半段,两段内部也已经保序,所以跨段平局取左边才符合原顺序。若输入两段不是按原连续分段取得,必须重新确认哪一条记录原本更早,不能只看它被放在哪个变量里。

连续分段的稳定归并两次平局先取左段
先保证子段内部保序,再保留跨段的原顺序。

把小于等于改为小于,会留下什么反例

仅对这一次最终归并,把条件改为“左关键字严格小于右关键字才取左边,否则取右边”。第一处平局先输出1D再输出1B;第二处平局先输出2C再输出2A,得到[1D,1B,2C,2A]。数字仍是1、1、2、2,但两组身份顺序都反了。因此有序并不足以证明稳定。

这里比较同样两段已排好的输入,差别只有最终归并的平局处理。某种语言的排序库、原地归并变体或另行指定的多关键字排序,需按其真实约定讨论,不能只凭算法名称断言某段程序必然保序。稳定算法也必须使用一致的比较规则。

左右平局优先得到相同升序数字但不同身份次序
只核对数字1、1、2、2,发现不了稳定性问题。

选什么样的小输入,才看得到顺序变化

全用不同数字,无法检出稳定性;全用相同数字但不标身份,也观察不到次序。练习归并排序稳定性,可从本文四记录开始,再测试左段为空、右段先耗尽、相等项同时在两边出现。最后一层保序不能修复子段已经打乱的相等项,所以同样规则应逐层成立。

知英教育可协助核对排序练习的比较条件。查看软件设计师学习安排,通过咨询入口提供原序列、比较键及归并步骤;四条记录为原创练习,不是考试原题,也不作成绩承诺。

资料来源:Virginia Tech OpenDSA:归并概念及相等时取左段的伪代码。核对日期:2026年10月22日。本文记录身份与反例独立编写。