Skip to content

Commit 72f6cb3

Browse files
committed
complete merge sort
1 parent 832351e commit 72f6cb3

File tree

2 files changed

+21
-3
lines changed

2 files changed

+21
-3
lines changed

docs/13_高级排序算法/merge_sort.md

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,8 @@ def merge_sort(seq):
4242
return new_seq
4343
```
4444

45-
注意我们这里有一个函数没实现,就是如何合并两个有序数组 merge_sorted_list
45+
注意我们这里有一个函数没实现,就是如何合并两个有序数组 merge_sorted_list。其实你在纸上画一画,
46+
合并两个有序数组并不难实现。
4647

4748
![](./merge_sorted_array.png)
4849

@@ -78,8 +79,25 @@ def merge_sorted_list(sorted_a, sorted_b):
7879
return new_sorted_seq
7980
```
8081

81-
这样就实现了归并排序。
82+
这样就实现了归并排序,并且你会发现它返回一个新的数组而不是修改原有数组
8283

8384

85+
# 时间复杂度
86+
我们来简单看下它归并排序的时间复杂度,假设排序 n 个数字时间复杂度是 T(n),这里为了方便假设 n 是 2 的幂
87+
88+
\begin{align}
89+
T(n)= \begin{cases} c, & \text {if $n$ = 1} \\ 2T(n/2)+cn, & \text{if $n$ > 1} \end{cases}
90+
\end{align}
91+
92+
![](./merge_sort_recursion_tree.png)
93+
94+
总的代价是 $cnlg(n)+cn$ ,忽略常数项可以认为是 O(nlg(n))
95+
96+
# 思考题
97+
- 请你完成归并排序的单元测试
98+
- 这里实现的归并排序是 inplace 的吗?
99+
- 归并排序是稳定的吗?稳定指的是排序前后相同大小的数字依然保持相对顺序。
100+
84101
# 延伸阅读
85-
- 《算法导论》第 2 章
102+
- 《算法导论》第 2 章和第 4 章,你需要了解下『主定理』,以及如何求解形如 $T(n)=aT(n/b) + f(n)$ 的递归式复杂度
103+
- 了解算法导论上递归式的三种求解方法:代入法,递归树法,主方法
Loading

0 commit comments

Comments
 (0)