Skip to content

Commit 640aaee

Browse files
committed
补充基本排序算法代码
1 parent ed19d23 commit 640aaee

File tree

2 files changed

+40
-3
lines changed

2 files changed

+40
-3
lines changed

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,7 @@ def insertion_sort(seq):
138138

139139
# 思考题
140140
- 本章介绍的几个排序算法平均时间复杂度是多少?
141+
- 请你补充插入排序的单元测试代码
141142

142143

143144
# 延伸阅读
Lines changed: 39 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,54 @@
1+
# -*- coding: utf-8 -*-
2+
3+
14
import random
25

36

47
def bubble_sort(seq): # O(n^2), n(n-1)/2 = 1/2(n^2 + n)
58
n = len(seq)
69
for i in range(n-1):
10+
print(seq) # 我打印出来让你看清楚每一轮最高、次高、次次高...的小朋友会冒泡到右边
711
for j in range(n-1-i): # 这里之所以 n-1 还需要 减去 i 是因为每一轮冒泡最大的元素都会冒泡到最后,无需再比较
812
if seq[j] > seq[j+1]:
913
seq[j], seq[j+1] = seq[j+1], seq[j]
14+
print(seq)
1015

1116

1217
def test_bubble_sort():
13-
# 注意 py3 返回迭代器,所以我都用 list 强转了,py2 range return list
18+
seq = list(range(10)) # 注意 python3 返回迭代器,所以我都用 list 强转了,python2 range 返回的就是 list
19+
random.shuffle(seq) # shuffle inplace 操作,打乱数组
20+
bubble_sort(seq)
21+
assert seq == sorted(seq) # 注意呦,内置的 sorted 就不是 inplace 的,它返回一个新的数组,不影响传入的参数
22+
23+
24+
def select_sort(seq):
25+
n = len(seq)
26+
for i in range(n-1):
27+
min_idx = i # 我们假设当前下标的元素是最小的
28+
for j in range(i+1, n): # 从 i 的后边开始找到最小的元素,得到它的下标
29+
if seq[j] < seq[min_idx]:
30+
min_idx = j # 一个 j 循环下来之后就找到了最小的元素它的下标
31+
if min_idx != i: # swap
32+
seq[i], seq[min_idx] = seq[min_idx], seq[i]
33+
34+
def test_select_sort():
1435
seq = list(range(10))
1536
random.shuffle(seq)
16-
bubble_sort(seq)
17-
# 注意呦,内置的 sorted 就不是 inplace 的,它返回一个新的数组,不影响传入的参数
37+
select_sort(seq)
1838
assert seq == sorted(seq)
39+
40+
41+
42+
def insertion_sort(seq):
43+
""" 每次挑选下一个元素插入已经排序的数组中,初始时已排序数组只有一个元素"""
44+
n = len(seq)
45+
print(seq)
46+
for i in range(1, n):
47+
value = seq[i] # 保存当前位置的值,因为转移的过程中它的位置可能被覆盖
48+
# 找到这个值的合适位置,使得前边的数组有序 [0,i] 有序
49+
pos = i
50+
while pos > 0 and value < seq[pos-1]:
51+
seq[pos] = seq[pos-1] # 如果前边的元素比它大,就让它一直前移
52+
pos -= 1
53+
seq[pos] = value # 找到了合适的位置赋值就好
54+
print(seq)

0 commit comments

Comments
 (0)