Skip to content
This repository was archived by the owner on Apr 11, 2021. It is now read-only.

Commit e317a76

Browse files
authored
Merge pull request #5 from Ehco1996/dev
baisc sort
2 parents 01f792f + 1fe9acb commit e317a76

File tree

8 files changed

+224
-29
lines changed

8 files changed

+224
-29
lines changed

README.md

Lines changed: 27 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
# Python 算法与数据结构视频教程
22

33
## 课程简介
4-
数据结构和算法是每个程序员需要掌握的基础知识之一,也是面试中跨不过的槛。目前关于 Python 算法和数据结构的中文资料比较欠缺
5-
笔者尝试录制视频教程帮助 Python 初学者掌握常用算法和数据结构,提升开发技能。
4+
数据结构和算法是每个程序员需要掌握的基础知识之一,也是面试中跨不过的槛。目前关于 Python 算法和数据结构的系统中文资料比较欠缺
5+
笔者尝试录制视频教程帮助 Python 开发者掌握常用算法和数据结构,提升开发技能。
66
本教程是付费教程(文字内容和代码免费),因为笔者录制的过程中除了购买软件、手写板等硬件之外,业余需要花费很多时间和精力来录制视频、查资料、编写课件和代码,养家糊口不容易,希望大家体谅。
77

88
## 链接
@@ -37,8 +37,8 @@
3737
电子书:[《Python web 入坑指南》](http://python-web-guide.readthedocs.io/zh/latest/)
3838

3939
## 课程内容
40-
包括我们在业务开发和面试中常用的算法和数据结构,希望可以帮助新人快速上手,很多老手写业务代码写多了很多基础知识忘记了,
41-
也可以作为回顾。课程尽量用通俗的方式讲解,结合 python 语言和日常开发实践的经验,让没有太多基础和非科班的同学也能够理解
40+
包括我们在业务开发和面试中常用的算法和数据结构,希望可以帮助 Python 开发者快速上手,很多老手写业务代码写多了很多基础知识忘记了,
41+
也可以作为回顾。课程尽量用通俗的方式讲解,结合 python 语言和日常开发实践的经验。书中代码可以作为大家的面试笔试参考
4242
对于每个算法和用到的数据结构我们需要知道:
4343

4444
- 原理
@@ -87,22 +87,24 @@ Python 抽象程度比较高, 我们能用更少的代码来实现功能,同
8787
不过只在 python3.5 下测试过,推荐用相同版本 Python 进行代码编写和测试。
8888

8989
## 受众
90-
想要学习 Python 算法和数据结构的初、中级同学,包括自学的同学和本科低年级学生等。需要掌握 Python
91-
的基本语法和面向对象编程的一些概念,我们这里只使用最基本的 Python 语法,不会再去介绍用到的 Python 语法糖。
90+
想要学习 Python 算法和数据结构的中级同学,包括自学的同学和本科低年级学生等。需要掌握 Python
91+
的基本语法和面向对象编程的一些概念,有一定的 Python 使用经验。我们这里尽量只使用最基本的 Python 语法,不会再去介绍用到的 Python 语法糖。
92+
93+
**注意啊啊: 教程着重于使用 Python 实现常用算法和数据结构,不适合从来没有学过算法和数据结构的新手同学,购买之前请慎重考虑,请确保你之前看过一本数据结构和算法的教材,最好有过其他语言实现算法的经验。**
9294

9395
# 预备知识
94-
- 有一定的 python 基础,掌握 Python 基本语法,了解 python 内置数据结构的使用方式。有过使用 Python 的经验。知道 class、module、yield 等。如果是 python 初学者,建议先补补基础,否则有些部分看着会比较吃力。
95-
- 基本的面向对象编程知识,会定义和使用 Python 中的类 (class)
96-
- 知道 Python 中的魔术方法,比如 `__len__` `__contains__`
96+
(注意:有些同学看起来很吃力,为了不花冤枉钱,我建议你先看看本电子书的内容和代码是否在自己的理解范围内,再决定是否购买视频。有些概念不是立马就能理解的,需要反复思考实践)
97+
98+
- 了解基本的数据结构和算法的概念,不适合**完全**没有了解过算法的新手,更不适合 Python 基础都没掌握的同学。购买之前请慎重考虑
9799
- 无需太多数学基础,仅在算法时间复杂度分析的时候会用到一些简单数学知识。对于学习基础算法,逻辑思维可能更重要一些
98100

99101
## 教材
100-
这里我参考过三本书:
102+
这里我参考过三本书,均可以网购纸质版或者网络上搜索电子版,建议大家先大致阅读一本教材掌握基本原理
101103

102-
[《算法图解》](https://book.douban.com/subject/26979890/): 图解的形式很适合新手,示例使用的是 python。建议基础较少的同学看这本书入门
104+
[《算法图解》](https://book.douban.com/subject/26979890/): 图解的形式很适合新手,示例使用的是 python。推荐基础较少的同学看这本书入门
103105

104106
[《Data Structures and Algorithms in Python》]( https://book.douban.com/subject/10607365/): 适合对 Python
105-
和算法比较熟悉的同学,或者是有其他语言编程经验的同学。本书是英文版,缺点是书中错误真的很多,代码有些无法运行而且不够 Pythonic。
107+
和算法比较熟悉的同学,或者是有其他语言编程经验的同学。本书是英文版,缺点是书中错误真的很多,代码有些无法运行而且不够 Pythonic。该书 [勘误](http://bcs.wiley.com/he-bcs/Books?action=resource&bcsId=9003&itemId=0470618299&resourceId=35653)
106108

107109
[《算法导论》第三版]( https://book.douban.com/subject/20432061/): 喜欢数学证明和板砖书的同学可以参考,有很多高级主题。使用伪代码
108110

@@ -112,7 +114,7 @@ Python 抽象程度比较高, 我们能用更少的代码来实现功能,同
112114
绘图演示+手写板+现场编码
113115

114116
我将使用绘图软件+手写板进行类似于纸笔形式的讲解,边讲边开个终端分成两个窗口,一个用 vim
115-
编写代码,另一个窗口用来运行代码,所有代码我将会现场编写(还是很有挑战的),不会像某些大学教师一样只喜欢念 ppt
117+
编写代码,另一个窗口用来运行代码,所有代码我将会现场编写(还是很有挑战的)。
116118
每个视频我会尽量控制时长,讲的内容尽量通俗易懂,摆脱学院派的授课方式。
117119

118120
你可以参考我在知乎发的专栏文章看下:
@@ -137,15 +139,15 @@ Python 抽象程度比较高, 我们能用更少的代码来实现功能,同
137139

138140
## 资料
139141

140-
- 视频。包含所有讲解视频
142+
- 视频。包含所有讲解视频(网易公开课)
141143
- 代码示例。所有代码我会放到 github 上。
142144
- markdown 讲义,包含视频内容的提要等内容
143145
- 延伸阅读。我会附上一些阅读资料方便想深入学习的同学
144146

145147
## 如何获取每章代码
146148

147-
注意每一章目录里都有 py 文件,在电子书里看不到。clone 下代码找到对应目录里的 python 文件即是每章涉及到的代码。
148-
由于代码实现千差万别,本书代码实现可能具有一定的个人风格,仅供参考。
149+
注意每一章目录里都有 py 文件,在电子书里看不到。clone 下本代码仓库找到对应目录里的 python 文件即是每章涉及到的代码。
150+
由于代码实现千差万别,本书代码实现具有一定的个人风格,不代表最佳实现,仅供参考。
149151

150152

151153
## 如何学习
@@ -167,7 +169,7 @@ Python 抽象程度比较高, 我们能用更少的代码来实现功能,同
167169
对于找工作的同学提升面试成功率。
168170

169171

170-
## 工具
172+
## 开发和测试工具
171173

172174
推荐使用以下工具进行开发,如果使用编辑器最好装对 应 Python 插件,笔者视频演示中使用了 vim,读者可以自己挑选自己喜欢的开发工具:
173175

@@ -177,7 +179,7 @@ Python 抽象程度比较高, 我们能用更少的代码来实现功能,同
177179
- Vscode
178180
- Vim/Emacs
179181

180-
代码中使用到了 pytest 测试框架和 when-changed 文件变动监控工具(方便我们修改完代码保存后自动执行测试),你需要用 pip 安装
182+
注意视频中使用到了 pytest 测试框架和 when-changed 文件变动监控工具(方便我们修改完代码保存后自动执行测试),你需要用 pip 安装
181183

182184
```py
183185
pip install pytest
@@ -189,15 +191,16 @@ pip install when-changed
189191
```sh
190192
#!/usr/bin/env bash
191193

192-
# pip install when-changed
194+
# pip install when-changed, 监控文件变动并且文件修改之后自动执行 pytest 单测,方便我们边修改边跑测试
193195
when-changed -v -r -1 -s ./ "py.test -s $1"
194196
```
195197
将以上内容放到 test.sh 文件后加上可执行权限, `chmod +x test.sh`,之后就可以用
196198

197199
```
198200
'./test.sh somefile.py'
199201
```
200-
每次我们改动了代码,就会自动执行代码里的单元测试了。pytest 会自动发现以 test 开头的函数并执行测试代码。
202+
每次我们改动了代码,就会自动执行代码里的单元测试了。pytest 会自动发现以 test
203+
开头的函数并执行测试代码。良好的工程需要我们用单测来保证,将来即使修改了内部实现逻辑也方便做回归验证。
201204

202205

203206
## 勘误
@@ -217,8 +220,8 @@ pip install when-changed
217220
如果读者关于代码、视频、讲义有任何疑问,欢迎一起讨论
218221
请注意以下几点:
219222

220-
- 优先在网易云课堂的讨论区提问,方便别的同学浏览。如果未购买视频,也可以直接在 github 里提出 issue,笔者会有空会给大家解答
221-
- 描述尽量具体,视频或者代码哪一部分有问题?
223+
- 优先在网易云课堂的讨论区提问,方便别的同学浏览。如果未购买视频,也可以直接在 github 里提出 issue,笔者有空会给大家解答和讨论
224+
- 描述尽量具体,视频或者代码哪一部分有问题?请尽量把涉及章节和代码贴出来,方便定位问题。
222225
- 如果涉及到代码,提问时请保持代码的格式
223226

224227

@@ -238,12 +241,13 @@ pip install -r requirements.txt
238241
# 如果你 fork 了本项目,可以定期拉取主仓库的代码来获取更新,目前还在不断更新相关章节
239242
```
240243

241-
编写并查看
244+
你可以 clone 本项目后在本地编写和查看电子书
242245
```sh
243246
mkdocs serve # 修改自动更新,浏览器打开 http://localhost:8000 访问
244247
# 数学公式参考 https://www.zybuluo.com/codeep/note/163962
245248
mkdocs gh-deploy # 部署到自己的 github pages
246249
```
250+
247251
扫码加入课程:
248252

249253
![扫码加入课程返现30%](http://7ktuty.com1.z0.glb.clouddn.com/Screen%20Shot%202018-06-02%20at%2020.37.46.png)

docs/01_抽象数据类型和面向对象编程/bag_adt.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ def __init__(self, maxsize=10):
88
self._items = list()
99

1010
def add(self, item):
11-
if len(self) > self.maxsize:
11+
if len(self) >= self.maxsize:
1212
raise Exception('Full')
1313
self._items.append(item)
1414

docs/03_链表/double_link_list.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ def append(self, value): # O(1), 你发现一般不用 for 循环的就是 O(
4141
self.length += 1
4242

4343
def appendleft(self, value):
44-
if self.maxsize is not None and len(self) > self.maxsize:
44+
if self.maxsize is not None and len(self) >= self.maxsize:
4545
raise Exception('LinkedList is Full')
4646
node = Node(value=value)
4747
if self.root.next is self.root: # empty

docs/03_链表/linked_list.py

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,11 @@ def append(self, value): # O(1)
4545
def appendleft(self, value):
4646
if self.maxsize is not None and len(self) >= self.maxsize:
4747
raise Exception('LinkedList is Full')
48-
headnode = self.root.next
4948
node = Node(value)
49+
if self.tailnode is None: # 如果原链表为空,插入第一个元素需要设置 tailnode
50+
self.tailnode = node
51+
52+
headnode = self.root.next
5053
self.root.next = node
5154
node.next = headnode
5255
self.length += 1
@@ -166,6 +169,13 @@ def test_linked_list_remove():
166169
ll.remove(7)
167170
print(list(ll))
168171

172+
def test_linked_list_append():
173+
ll = LinkedList()
174+
ll.appendleft(1)
175+
ll.append(2)
176+
assert list(ll) == [1, 2]
177+
169178

170179
if __name__ == '__main__':
171180
test_linked_list()
181+
test_linked_list_append()

docs/04_队列/queue.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ def __len__(self):
3232
return self.length
3333

3434
def append(self, value): # O(1)
35-
if self.maxsize is not None and len(self) > self.maxsize:
35+
if self.maxsize is not None and len(self) >= self.maxsize:
3636
raise Exception('LinkedList is Full')
3737
node = Node(value) # 构造节点
3838
tailnode = self.tailnode

docs/05_栈/stack.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ def tailnode(self):
3131
return self.root.prev
3232

3333
def append(self, value): # O(1), 你发现一般不用 for 循环的就是 O(1),有限个步骤
34-
if self.maxsize is not None and len(self) > self.maxsize:
34+
if self.maxsize is not None and len(self) >= self.maxsize:
3535
raise Exception('LinkedList is Full')
3636
node = Node(value=value)
3737
tailnode = self.tailnode() or self.root
@@ -43,7 +43,7 @@ def append(self, value): # O(1), 你发现一般不用 for 循环的就是 O(
4343
self.length += 1
4444

4545
def appendleft(self, value):
46-
if self.maxsize is not None and len(self) > self.maxsize:
46+
if self.maxsize is not None and len(self) >= self.maxsize:
4747
raise Exception('LinkedList is Full')
4848
node = Node(value=value)
4949
if self.root.next is self.root: # empty

ehco/basic_sort/basic_sort.py

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
import random
2+
3+
4+
def bubble_sort(seq):
5+
'''O(n^2)'''
6+
n = len(seq)
7+
8+
for i in range(n-1):
9+
print(seq)
10+
for j in range(n-1-i):
11+
if seq[j] > seq[j+1]:
12+
seq[j], seq[j+1] = seq[j+1], seq[j]
13+
print('+++++++++++++bubble++++++++++++++')
14+
return seq
15+
16+
17+
def select_sort(seq):
18+
'''O(n)'''
19+
n = len(seq)
20+
21+
for i in range(n-1):
22+
min_idx = i
23+
for j in range(i+1, n):
24+
if seq[j] < seq[min_idx]:
25+
min_idx = j
26+
if min_idx != i:
27+
seq[i], seq[min_idx] = seq[min_idx], seq[i]
28+
print(seq)
29+
print('+++++++++++++select++++++++++++++')
30+
return seq
31+
32+
33+
def insert_sort(seq):
34+
'''O(n)'''
35+
n = len(seq)
36+
37+
for i in range(0, n):
38+
v = seq[i]
39+
pos = i
40+
while pos > 0 and v < seq[pos-1]:
41+
seq[pos] = seq[pos-1]
42+
pos -= 1
43+
seq[pos] = v
44+
print('+++++++++++++insert++++++++++++++')
45+
return seq
46+
47+
48+
def test_sort():
49+
seq = list(range(10))
50+
random.shuffle(seq)
51+
52+
assert bubble_sort(seq[:]) == sorted(seq)
53+
print("\n\n")
54+
assert select_sort(seq[:]) == sorted(seq)
55+
print("\n\n")
56+
assert insert_sort(seq[:]) == sorted(seq)
57+
58+
59+
if __name__ == "__main__":
60+
test_sort()

0 commit comments

Comments
 (0)