![Python算法设计与分析从入门到精通](https://wfqqreader-1252317822.image.myqcloud.com/cover/845/44509845/b_44509845.jpg)
4.4 合并排序算法
合并排序法是针对已经排好序的两个或两个以上的数列,通过合并的方式,将其组合成一个有序的大数列。使用合并排序法为一个数列排序时,首先将无序的数列分成若干小份,分若干份的规则就是不断把每段长度除以2(对半分),直到分到不能再分为止(当数列中最多只有两个元素时视为不可再分),然后对最小份进行排序,最后再逐步合并成一个有序的大数列,如图4.25所示。
![](https://epubservercos.yuewen.com/569667/23721647609535706/epubprivate/OEBPS/Images/Figure-P101_9324.jpg?sign=1738854852-RFsLlo1qhR3fREoFFBIEshW2hxJunyTu-0-828386b69e85bc9e923855391267fcac)
图4.25 合并排序法工作原理
例如,有这样一组数据:33, 10, 49, 78, 57, 96, 66, 21,如图4.26所示。对其递增排序,步骤如下。
![](https://epubservercos.yuewen.com/569667/23721647609535706/epubprivate/OEBPS/Images/Figure-P101_9328.jpg?sign=1738854852-wWr78ZEAXTWdlbo7LblXUfK1b2DSpKck-0-734c45fb75ba271be33d3398e30ebf87)
图4.26 无序的原始值
(1)将原始数列一分为二,得到两个数列,即数列1和数列2,数列1为33, 10, 49, 78;数列2为57, 96, 66, 21,如图4.27所示。
![](https://epubservercos.yuewen.com/569667/23721647609535706/epubprivate/OEBPS/Images/Figure-P101_9332.jpg?sign=1738854852-VyAFqPp7MC6clKrb7NuQuFcoJfYzMn6p-0-64ce9f9a4aadd86c3c6851e5fcfded07)
图4.27 将数列分为两个数列
(2)将数列1和数列2再一分为二,得到数列a、数列b、数列c和数列d,即每个数列中包含两个数据,并将每份中的两个数据进行排序,如图4.28所示。
![](https://epubservercos.yuewen.com/569667/23721647609535706/epubprivate/OEBPS/Images/Figure-P101_9336.jpg?sign=1738854852-sEl80OE9GyDq0StuE1IjgzXCDcbbt0gH-0-9113865c3fdc165c385a089ef7c99007)
图4.28 将4个数列中的数据分别排序
(3)合并排好序的数列元素。将数列a与数列b合并为数列A,数列c与数列d合并为数列B,再对数列A和数列B中的元素分别进行排序,如图4.29所示。
![](https://epubservercos.yuewen.com/569667/23721647609535706/epubprivate/OEBPS/Images/Figure-P102_9346.jpg?sign=1738854852-TNYOMqBMC2DzqupU6PJMOaqDNO5x2gBW-0-fc4477bf6a16b6afb3c49c79d2480191)
图4.29 将数列合并为两个数列并排序
(4)将数列A与数列B合并为一个数列,并对其中的元素排序,最终排序结果如图4.30所示。
![](https://epubservercos.yuewen.com/569667/23721647609535706/epubprivate/OEBPS/Images/Figure-P102_9350.jpg?sign=1738854852-L6GEeFFGRrnrtvm2rJyA6xFK5fYP5099-0-e0c7076e0330b60d1e1cd14fa6fa59e9)
图4.30 将数列合并为一个数列并排序
【实例4.7】 使用合并排序法将列表中的数字递增排序。(实例位置:资源包\Code\04\07)
用Python代码实现上方示例中的合并排序算法,具体代码如下:
![](https://epubservercos.yuewen.com/569667/23721647609535706/epubprivate/OEBPS/Images/Figure-P102_32960.jpg?sign=1738854852-0VolUPLQ4lH2MJRDse2Wmky4datFgdVu-0-deac7648f0f5c1a9a928318721805537)
运行结果如图4.31所示。
![](https://epubservercos.yuewen.com/569667/23721647609535706/epubprivate/OEBPS/Images/Figure-P103_9523.jpg?sign=1738854852-zLGeXYu6M0QEIxypxaLjsrAkTYoxI8Ox-0-db8d39e5a6a0eb0d55e9b40018aa4570)
图4.31 合并排序法
【实例4.8】 争夺十二生肖。(实例位置:资源包\Code\04\08)
很久以前,玉帝决定在人间选拔12种动物作为生肖,他定好一个日子,动物们都来报名,先到的12种动物将成为十二生肖。利用合并排序法根据12种动物到达的时间(如数字6.25代表6:25到达),对十二生肖顺序进行排序。具体代码如下:
![](https://epubservercos.yuewen.com/569667/23721647609535706/epubprivate/OEBPS/Images/Figure-P103_32961.jpg?sign=1738854852-hitcFUaXOJFGdG4GiPOWWBdcZv7n0AvX-0-fe7e3451467505e2f66ab450c0259268)
运行结果如图4.32所示。
![](https://epubservercos.yuewen.com/569667/23721647609535706/epubprivate/OEBPS/Images/Figure-P104_9792.jpg?sign=1738854852-VA4RaTRn1kDYAPBg6mM9Q7tGIx4cS0fG-0-7c2f9fa89936207fe4d672b9a71df81e)
图4.32 运行结果