归并排序–分而治之
思想:分而治之,数组从中间划分,一分为二,递归的解决左右子集
核心:合并有序的数组
时间复杂度
o
(
n
l
o
g
n
)
o(nlogn)
o(nlogn),以2为底
时间复杂度分析:长度为n的数组,二分需要
l
o
g
(
n
)
次
log(n)次
log(n)次
合并有序数组,需进行规模为n的操作,所以需要
n
∗
l
o
g
n
n*logn
n∗logn规模的运算
缺点:需要额外的辅助空间 O ( n ) O(n) O(n)
要求:十五分钟以内写出归并排序
#python 实现归并排序
#分而治之的思想 时间复杂度 O(nlogn)
def merge_sort(li):
# 作用 将传递进来的列表拆分到最小单元(函数的出口)
if len(li) == 1:
return li
mid = len(li) // 2
left = li[:mid]
right = li[mid:]
left_li = merge_sort(left) # 判断 left列表是否为最小单元
right_li = merge_sort(right) # 判断 right列表是否为最小单元
return marge(left_li, right_li) # 合并
# print(left_li,right_li)
def marge(left_li, right_li):
reslut = []
while len(left_li) > 0 and len(right_li) > 0:
if left_li[0] > right_li[0]:
reslut.append(right_li.pop(0))
else:
reslut.append(left_li.pop(0))
if left_li:
reslut.extend(left_li)
if right_li:
reslut.extend(right_li)
return reslut
s = merge_sort([1,5,3,2,6,8,4])
print(s)