Skip to content

Commit 832351e

Browse files
committed
merge sort
1 parent 640aaee commit 832351e

File tree

11 files changed

+168
-17
lines changed

11 files changed

+168
-17
lines changed

README.md

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -173,9 +173,12 @@ Python 抽象程度比较高, 我们能用更少的代码来实现功能,同
173173

174174
安装依赖:
175175
```sh
176-
pip install mkdocs # 制作电子书
176+
pip install mkdocs # 制作电子书, http://markdown-docs-zh.readthedocs.io/zh_CN/latest/
177177
# https://stackoverflow.com/questions/27882261/mkdocs-and-mathjax/31874157
178178
pip install https://github.com/mitya57/python-markdown-math/archive/master.zip
179+
180+
# 或者直接
181+
pip install -r requirements.txt
179182
```
180183

181184
编写并查看:

docs/12_基本排序算法/basic_sort.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,14 +31,14 @@ def select_sort(seq):
3131
if min_idx != i: # swap
3232
seq[i], seq[min_idx] = seq[min_idx], seq[i]
3333

34+
3435
def test_select_sort():
3536
seq = list(range(10))
3637
random.shuffle(seq)
3738
select_sort(seq)
3839
assert seq == sorted(seq)
3940

4041

41-
4242
def insertion_sort(seq):
4343
""" 每次挑选下一个元素插入已经排序的数组中,初始时已排序数组只有一个元素"""
4444
n = len(seq)
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
# 高级排序算法
2+
3+
本章开始讲几个高级一些的排序算法,因为涉及到分治、递归和一些高级数据结构等,所以比前一章节的基本排序要稍微难理解一些。包括:
4+
5+
- [分治法与归并排序](./merge_sort.md)
6+
- [快速排序](./quick_sort.md)
7+
- [堆和堆排序](./heap_sort.md)

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

Whitespace-only changes.
Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
# 分治法 (Divide and Conquer)
2+
3+
很多有用的算法结构上是递归的,为了解决一个特定问题,算法一次或者多次递归调用其自身以解决若干子问题。
4+
这些算法典型地遵循分治法的思想:将原问题分解为几个规模较小但是类似于原问题的子问题,递归求解这些子问题,
5+
然后再合并这些问题的解来建立原问题的解。
6+
7+
分治法在每层递归时有三个步骤:
8+
9+
- **分解**原问题为若干子问题,这些子问题是原问题的规模最小的实例
10+
- **解决**这些子问题,递归地求解这些子问题。当子问题的规模足够小,就可以直接求解
11+
- **合并**这些子问题的解成原问题的解
12+
13+
14+
# 归并排序
15+
现在我们就来看下归并排序是是如何利用分治法解决问题的。
16+
17+
- **分解**:将待排序的 n 个元素分成各包含 n/2 个元素的子序列
18+
- **解决**:使用归并排序递归排序两个子序列
19+
- **合并**:合并两个已经排序的子序列以产生已排序的答案
20+
21+
考虑我们排序这个数组:[10,23,51,18,4,31,13,5] ,我们递归地将数组进行分解
22+
23+
![](./merge_sort_split.png)
24+
25+
当数组被完全分隔成只有单个元素的数组时,我们需要把它们合并回去,每次两两合并成一个有序的序列。
26+
27+
![](./merge_sort_merge.png)
28+
29+
用递归代码来描述这个问题:
30+
31+
```py
32+
def merge_sort(seq):
33+
if len(seq) <= 1: # 只有一个元素是递归出口
34+
return seq
35+
else:
36+
mid = int(len(seq)/2)
37+
left_half = merge_sort(seq[:mid])
38+
right_half = merge_sort(seq[mid:])
39+
40+
# 合并两个有序的数组
41+
new_seq = merge_sorted_list(left_half, right_half)
42+
return new_seq
43+
```
44+
45+
注意我们这里有一个函数没实现,就是如何合并两个有序数组 merge_sorted_list
46+
47+
![](./merge_sorted_array.png)
48+
49+
50+
```py
51+
def merge_sorted_list(sorted_a, sorted_b):
52+
""" 合并两个有序序列,返回一个新的有序序列
53+
54+
:param sorted_a:
55+
:param sorted_b:
56+
"""
57+
length_a, length_b = len(sorted_a), len(sorted_b)
58+
a = b = 0
59+
new_sorted_seq = list()
60+
61+
while a < length_a and b < length_b:
62+
if sorted_a[a] < sorted_b[b]:
63+
new_sorted_seq.append(sorted_a[a])
64+
a += 1
65+
else:
66+
new_sorted_seq.append(sorted_b[b])
67+
b += 1
68+
69+
# 最后别忘记把多余的都放到有序数组里
70+
while a < length_a:
71+
new_sorted_seq.append(sorted_a[a])
72+
a += 1
73+
74+
while b < length_b:
75+
new_sorted_seq.append(sorted_b[b])
76+
b += 1
77+
78+
return new_sorted_seq
79+
```
80+
81+
这样就实现了归并排序。
82+
83+
84+
# 延伸阅读
85+
- 《算法导论》第 2 章
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
# -*- coding: utf-8 -*-
2+
3+
4+
def merge_sort(seq):
5+
if len(seq) <= 1: # 只有一个元素是递归出口
6+
return seq
7+
else:
8+
mid = int(len(seq)/2)
9+
left_half = merge_sort(seq[:mid])
10+
right_half = merge_sort(seq[mid:])
11+
12+
# 合并两个有序的数组
13+
new_seq = merge_sorted_list(left_half, right_half)
14+
return new_seq
15+
16+
17+
def merge_sorted_list(sorted_a, sorted_b):
18+
""" 合并两个有序序列,返回一个新的有序序列
19+
20+
:param sorted_a:
21+
:param sorted_b:
22+
"""
23+
length_a, length_b = len(sorted_a), len(sorted_b)
24+
a = b = 0
25+
new_sorted_seq = list()
26+
27+
while a < length_a and b < length_b:
28+
if sorted_a[a] < sorted_b[b]:
29+
new_sorted_seq.append(sorted_a[a])
30+
a += 1
31+
else:
32+
new_sorted_seq.append(sorted_b[b])
33+
b += 1
34+
35+
while a < length_a:
36+
new_sorted_seq.append(sorted_a[a])
37+
a += 1
38+
39+
while b < length_b:
40+
new_sorted_seq.append(sorted_b[b])
41+
b += 1
42+
43+
return new_sorted_seq
44+
45+
46+
def test_merge_sort():
47+
import random
48+
seq = list(range(10))
49+
random.shuffle(seq)
50+
assert merge_sort(seq) == sorted(seq)
51+
53.3 KB
Loading
Loading
Loading

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

Whitespace-only changes.

mkdocs.yml

Lines changed: 20 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -5,20 +5,25 @@ extra_javascript:
55

66
markdown_extensions:
77
- mdx_math:
8-
enable_dollar_delimiter: True #for use of inline $..$
8+
enable_dollar_delimiter: True #for use of inline $..$
99

1010
pages:
11-
- 课程简介: 'index.md'
12-
- 课程简介之笨方法学算法: '00_课程简介之笨方法学算法/why_and_how_to_learn.md'
13-
- 抽象数据类型和面向对象编程: '01_抽象数据类型和面向对象编程/ADT_OOP.md'
14-
- 数组和列表: '02_数组和列表/array_and_list.md'
15-
- 链表: '03_链表/linked_list.md'
16-
- 队列: '04_队列/queue.md'
17-
- : '05_栈/stack.md'
18-
- 算法分析: '06_算法分析/big_o.md'
19-
- 哈希表: '07_哈希表/hashtable.md'
20-
- 字典: '08_字典/dict.md'
21-
- 集合: '09_集合/set.md'
22-
- 递归: '10_递归/recursion.md'
23-
- 线性查找与二分查找: '11_线性查找与二分查找/search.md'
24-
- 基本排序算法: '12_基本排序算法/basic_sort.md'
11+
- 课程简介: 'index.md'
12+
- 课程简介之笨方法学算法: '00_课程简介之笨方法学算法/why_and_how_to_learn.md'
13+
- 抽象数据类型和面向对象编程: '01_抽象数据类型和面向对象编程/ADT_OOP.md'
14+
- 数组和列表: '02_数组和列表/array_and_list.md'
15+
- 链表: '03_链表/linked_list.md'
16+
- 队列: '04_队列/queue.md'
17+
- : '05_栈/stack.md'
18+
- 算法分析: '06_算法分析/big_o.md'
19+
- 哈希表: '07_哈希表/hashtable.md'
20+
- 字典: '08_字典/dict.md'
21+
- 集合: '09_集合/set.md'
22+
- 递归: '10_递归/recursion.md'
23+
- 线性查找与二分查找: '11_线性查找与二分查找/search.md'
24+
- 基本排序算法: '12_基本排序算法/basic_sort.md'
25+
- 高级排序算法:
26+
- 高级排序算法: '13_高级排序算法/advanced_sorting.md'
27+
- 分治法与归并排序: '13_高级排序算法/merge_sort.md'
28+
- 快速排序: '13_高级排序算法/quick_sort.md'
29+
- 堆与堆排序: '13_高级排序算法/heap_sort.md'

0 commit comments

Comments
 (0)