归并排序该是采用分治法(Divide and Conquer)的一个非常典型的应用,时间复杂度为。
图解算法:
1. 分割
2. 归并
每次归并比较每个分支下的两个子序列的首位然后进行排序后向上合并。
比如3和6先比较,所以3先往上放;接着比较5和6,5往上放,最后放6。1和4同理。
此时比较两个子序列的首位3和1,1往上放;再比较3和4,3往上放;5和4比较,4往上放;最后再放5和6.
Python实现:
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
# 对两个列表中的元素 两两对比。
# 将最小的元素,放到result中,并对当前列表下标加1
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