基本思想
归并排序(merge-sort)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案合并在一起,即分而治之)。
分治类似于二分的思想,打个不恰当的比喻,我们知道常见的冒泡,简单插入排序的时间复杂度都是
O
(
n
2
)
O(n^2)
O(n2),并且如果原数组的有序程度越高,这些简单排序的实际时间复杂度就会越小。对于一个长度为
n
n
n的无序数组,如果一分为二成两个子数组,对每个子数组排序,那么时间为
O
(
(
n
/
2
)
2
)
=
O
(
n
2
/
4
)
O((n/2)^2)=O(n^2/4)
O((n/2)2)=O(n2/4),然后由于子数组有序那么合并的时间也不需要很长,因此总体来讲分治的思想就能降低时间复杂度。
如下: 将数组切分成至多两个元素的一个个子数组,对每个子数组比较排序之后然后与依次合并,这样的形式也很像完全二叉树,下面是针对一个任意无序数组的动图演示。
代码
def mergesort(seq
):
"""归并排序"""
if len(seq
) <= 1:
return seq
mid
= len(seq
) / 2
left
= mergesort
(seq
[:mid
])
right
= mergesort
(seq
[mid
:])
return merge
(left
, right
)
def merge(left
, right
):
"""合并两个已排序好的列表,产生一个新的已排序好的列表"""
result
= []
i
= 0
j
= 0
while i
< len(left
) and j
< len(right
):
if left
[i
] <= right
[j
]:
result
.append
(left
[i
])
i
+= 1
else:
result
.append
(right
[j
])
j
+= 1
result
+= left
[i
:]
result
+= right
[j
:]
return result
seq
= [5,3,0,6,1,4]
print('排序前:',seq
)
result
= mergesort
(seq
)
print('排序后:',result
)