归并排序采用分治的思想。‘分’:将数组一分为二,分割为左右两个数组,再对每个分割后的每个数组再分别一分为二,如此分割下去直到每个数组只剩下一个元素时,便停止分割。
‘合’:从下往上沿着分割的路径对左右两个数组进行排序合并。整个流程如下图所示。同时,它和冒泡排序一样也是稳定排序,不会处理相同元素。
下面使用Python用递归的方法实现归并排序。
def orders(ls1,ls2):
### 对两个分块进行排序合并
ls = []
length1 = len(ls1)
length2 = len(ls2)
s1 = 0
s2 = 0
while s1<length1 and s2<length2:
if ls1[s1] < ls2[s2]:
ls.append(ls1[s1])
s1 += 1
else:
ls.append(ls2[s2])
s2 += 1
if s1 < length1:
ls.extend(ls1[s1:])
if s2 < length2:
ls.extend(ls2[s2:])
return ls
def Guibing(ls):
### 递归实现分治
if len(ls) <= 1:
return ls
mid = len(ls)//2
left = Guibing(ls[:mid])
right = Guibing(ls[mid:])
res = orders(left,right)
return res
该算法的时间复杂度为 nlogn