归并
- 假设列表两段有序,将其合成为一个有序列表
使用归并
- 分解:将列表越分越小,直至分成一个元素
- 终止条件:一个元素是有序的
- 合并:将两个有序列表归并,列表越来越大
代码
# 归并
def merge(li, low, mid, high):
i = low
j = mid+1
ltmp = []
while i <= mid and j <= high: # 只要左后两边都有数
if li[i] < li[j]:
ltmp.append(li[i])
i += 1
else:
ltmp.append(li[j])
j += 1
# while 执行完肯定有一部分没数了
while i <= mid:
ltmp.append(li[i])
i += 1
while j <= high:
ltmp.append(li[j])
j += 1
li[low:high+1] = ltmp
# 排序
def merge_sort(li, low, high):
if low < high: # 至少有两个元素,递归
mid = (low+high) //2
merge_sort(li, low, mid)
merge_sort(li, mid+1, high)
merge(li, low, mid, high)
li = [6,4,7,1,24,35,14,2,6,8]
merge_sort(li,0,len(li)-1)
print(li)
复杂度
时间复杂度:
O
(
n
log
n
)
O(n\log{n})
O(nlogn)
空间复杂度:
O
(
n
)
O(n)
O(n)