众所周知,通过比较元素进行排序的算法,其时间复杂度最低为O(nlog^n),而归并排序算法的时间复杂度为O(nlog^n).归并排序是分治策略的典型应用。分而治之的策略是将一个大问题多次划分,产生多个小的子问题,直到划分成最小单元。这些小问题很容易解决,递归合并解决的小问题,最终解决原问题。归并排序是将一个无序序列按照分而治之的策略进行多次划分,直到每个子序列都是最小单元(只有一个元素或者空序列),这些子序列就可以看作是有序序列。这时候子序列的排序问题就解决了,所以只需要注意递归合并这些子序列的时候,合并产生的子序列也是有序的,最终的结果一定是有序序列。思路清晰了,怎么办?假设有一个由八个元素组成的序列,八个元素的大小顺序是乱序的。根据分而治之的策略,可以将序列一分为二,这样就分为两个由四个元素组成的子序列。但是这两个子序列还是不能轻易解决排序问题,于是继续分裂,再次分裂后得到4个由2个元素组成的子序列,再分裂,分裂成8个由1个元素组成的子序列。此时每个子序列中只有一个元素,必须是有序的,那么子序列的排序问题就解决了,划分的步骤就结束了。将八个由一个元素组成的有序序列组合起来,合并成四个由两个元素组成的有序序列,然后再合并,直到合并成一个由八个元素组成的有序序列。问题解决。说起来容易,把两个只有一个元素的有序序列合并成一个有序序列很简单,只比较其中唯一的一个元素,但是如何把多个元素的有序序列合并成一个大的有序序列呢?让我们把前面的例子放在一边,来一个新的例子。假设有两个有序序列,需要将这两个有序序列合并为一个有序序列。如上图所示,可以想象两个人各自拿着一个有序的序列来玩游戏。两人分别从自己持有的序列中取一个值最小的元素作为手牌。与手牌大小相比,较小的将手牌弃入墓地,然后从持有的序列中取出价值最低的元素加入手牌。直到一方失去所有元素,另一方按顺序丢弃墓地中剩余的元素。在游戏中,墓地中元素的添加顺序是从小到大。如果墓地被理解为一个序列,那么现在就得到了一个合并的有序序列。如果将上述的排序方法整合到归并排序中,那么将剩余的两个由多个元素组成的排序序列合并为一个排序序列的问题就迎刃而解了。解决了代码归并排序的原理和问题。上面代码:defmergesort(unsort_list):'''当一个子序列的元素个数为1或空序列时,子序列会自动变成有序序列,直接返回子序列'''iflen(unsort_list)<=1:returnunsort_list'''将序列(元素个数大于1)一分为二'''中值index=int(len(unsort_list)/2)leftsequence=mergesort(unsort_list[:medianindex])rightsequence=mergesort(unsort_list[medianindex:])'''将两个排序序列合并为一个排序序列'''leftpointer,rightpointer,pointer,leftborder,Rightboundary=0,0,0,len(leftsequence),len(rightsequence)while(leftpointer
