归并排序采用了二分法,首先对于一个长数组,将其不停的分为左边和右边,以此递归分下去,直到把数组分解成最小单元。然后合并两个有序数组,比较两个数组的最前面的数,谁小就先取谁,取了后相应的指针就往后移一位,直到一个数组为空,最后把另一个数组的剩余部分复制过来即可。
时间复杂度:O(nlogn)
稳定性:稳定
缺点:空间复杂度很大
python代码实现
li = [4, 2, 1, 3, 5, 6]
def merge_sort(li):
if len(li) <= 1: # 若待拆分数组长度为1,直接返回
return li
num = len(li) // 2 # 取拆分中间位置
left = merge_sort(li[:num]) # 递归拆分
right = merge_sort(li[num:])
return merge(left, right)
def merge(left, right):
r, l = 0, 0
result = []
while l < len(left) and r < len(right):
if left[l] < right[r]:
result.append(left[l])
l += 1
else:
result.append(right[r])
r += 1
result += right[r:]
result += left[l:]
print(result)
return result
merge_sort(li)