归并排序
原理:
前提是必须确保这个列表左右两边有序
例如:[2,5,7,8,9,1,3,4,6]
以9为中心
2 和 1比较 [].append(1)
2 和 3比较 [1].append(2)
3 和 5比较 [1,2].append(3)
.
.
.
最后得到新列表:[1,2,3,4,5,6,7,8,9]
去除假设:利用递归。分解,合并,归并一步完成
复杂度: O(NlogN) 当n等于16层时,他一共要执行4次func() 每一个func就是O(n) 所以就是 N * logN
"""
1 def merge(li, low, mid, high):
2 i = low
3 j = mid + 1
4 tmp = []
5 while i <= mid and j <= high:
6 if li[i] < li[j]:
7 tmp.append(li[i])
8 i += 1
9 else:
10 tmp.append(li[j])
11 j += 1
12
13 # while执行完毕后,肯定有一边先没数了
14 while i <= mid:
15 # 左边还有数,加到[]
16 tmp.append(li[i])
17 i += 1
18 while j <= high:
19 # 右边还有数,加到[]
20 tmp.append(li[j])
21 j += 1
22 li[low:high + 1] = tmp
23
24 def merge_sort(li, low, high):
25 # 至少有两个元素
26 if low < high:
27 mid = (low + high) // 2
28 merge_sort(li, low, mid)
29 print(low,mid,high)
30 merge_sort(li, mid + 1, high)
31 merge(li, low, mid, high)
32
33 li = [2, 5, 7, 8, 9, 1, 3, 4, 6]
34
35 merge_sort(li, 0, 8)
36 print(li)