|
| 1 | +# -*- coding: utf-8 -*- |
| 2 | + |
| 3 | + |
1 | 4 | import random
|
2 | 5 |
|
3 | 6 |
|
4 | 7 | def bubble_sort(seq): # O(n^2), n(n-1)/2 = 1/2(n^2 + n)
|
5 | 8 | n = len(seq)
|
6 | 9 | for i in range(n-1):
|
| 10 | + print(seq) # 我打印出来让你看清楚每一轮最高、次高、次次高...的小朋友会冒泡到右边 |
7 | 11 | for j in range(n-1-i): # 这里之所以 n-1 还需要 减去 i 是因为每一轮冒泡最大的元素都会冒泡到最后,无需再比较
|
8 | 12 | if seq[j] > seq[j+1]:
|
9 | 13 | seq[j], seq[j+1] = seq[j+1], seq[j]
|
| 14 | + print(seq) |
10 | 15 |
|
11 | 16 |
|
12 | 17 | 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(): |
14 | 35 | seq = list(range(10))
|
15 | 36 | random.shuffle(seq)
|
16 |
| - bubble_sort(seq) |
17 |
| - # 注意呦,内置的 sorted 就不是 inplace 的,它返回一个新的数组,不影响传入的参数 |
| 37 | + select_sort(seq) |
18 | 38 | 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