归并排序是由冯诺依曼首次提出,该算法采取的是分而治之(Divide and Conquer)的思想,速度仅次于快速排序且为稳定算法,适合的排序情况为总体无序,而各子集相对有序。
原理:其思想就是分而治之,具体来讲就是把原序列不断分解为子序列,直到子序列只有一个元素为止,然后再将各个子序列进行有序归并直到序列数为一。
从上图就可以看出归并算法的流程:
- 将原始序列分为2个子序列
- 再将2个子序列分成4个子序列
- 直到每个子序列中只有1个元素
- 然后进行归并操作,并排序,不断重复直到只有一个序列为止
代码实现
#递归实现
def merge(left,right,s): #传入左序列和右序列还有原序列
i = j = 0
while i + j < len(s): #原序列的作用为控制循环次数
if (j == len(right)) or (i < len(left) and left[i] < right[j]): #如果右边的序列走完了或左边的序列[i]的值小于右边序列[j]的值 则将左边[i]的值保存到s序列
s[i+j] = left[i]
i += 1
else: #不然将右边序列[j]的值保存到s序