归并排序的实现
分解: 将列表越分越小,直至分成一个元素
终止条件: 一个元素是有序的 一个或者零个
合并: 将两个有序列表归并,列表越来越大
def merge_sort_test(li,low,high):
if low < high: #至少有两个元素,递归
mid = (low + high) //2
merge_sort_test(li,low,mid)
merge_sort_test(li,mid+1,high)
print(li[low:high+1])
li = list(range(16))
import random
random.shuffle(li)
print(li)
merge_sort_test(li,0,len(li)-1)
print(li)
归并排序–归并
假设现在的列表分段有序,如何将其合成为一个有序列表
谁小谁出来
#high是最后一个元素
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 有就走哪个
while i <= mid:
ltmp.append(li[i])
i += 1
while j <= high:
ltmp.append(li[j])
j += 1
#这是切片
li[low:high+1] = ltmp
li = [2,4,5,7,1,3,6,8]
merge(li, 0, 3, 7)
print(li)
- 时间复杂度O(nlogn)
- 空间复杂度O(n) #归并需要额外的空间
每一层是n,整个复杂度就是n乘以logn