Skip to content

Commit b9384bc

Browse files
committed
add sort
1 parent f4ef044 commit b9384bc

File tree

4 files changed

+72
-57
lines changed

4 files changed

+72
-57
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ def insertion_sort(seq):
5050
# 找到这个值的合适位置,使得前边的数组有序 [0,i] 有序
5151
pos = i
5252
while pos > 0 and value < seq[pos-1]:
53-
seq[pos] = seq[pos-1] # 如果前边的元素比它大,就让它一直前移
53+
seq[pos] = seq[pos-1] # 如果前边的元素比它大,就让它一直后移
5454
pos -= 1
5555
seq[pos] = value # 找到了合适的位置赋值就好
5656
print(seq)

ehco/hashtable/hashtable_adt.py

Lines changed: 12 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,8 @@
1-
class Array(object):
1+
from ehco.array_list.array_and_list import Array
22

3-
def __init__(self, size=32, init=None):
4-
self._size = size
5-
self._items = [init] * size
63

7-
def __getitem__(self, index):
8-
return self._items[index]
9-
10-
def __setitem__(self, index, value):
11-
self._items[index] = value
12-
13-
def __len__(self):
14-
return self._size
15-
16-
def clear(self, value=None):
17-
for i in range(self._items):
18-
self._items[i] = value
19-
20-
def __iter__(self):
21-
for item in self._items:
22-
yield item
23-
24-
25-
class Slot(object):
4+
class Slot:
265
"""定义一个 hash 表 数组的槽
27-
注意,一个槽有三种状态,看你能否想明白。相比链接法解决冲突,二次探查法删除一个 key 的操作稍微复杂。
286
297
1.从未使用 HashMap.UNUSED。此槽没有被使用和冲突过,查找时只要找到 UNUSED 就不用再继续探查了
308
2.使用过但是 remove 了,此时是 HashMap.EMPTY,该探查点后边的元素扔可能是有key
@@ -35,7 +13,7 @@ def __init__(self, key, value):
3513
self.key, self.value = key, value
3614

3715

38-
class HashTable(object):
16+
class HashTable:
3917

4018
# 没有被使用过的
4119
UNUSED = None
@@ -48,7 +26,6 @@ def __init__(self):
4826

4927
@property
5028
def _load_factor(self):
51-
# load factor 超过0.8的时候重新分配
5229
return self.length / float(len(self._table))
5330

5431
def __len__(self):
@@ -134,18 +111,18 @@ def __iter__(self):
134111
def test_hash_table():
135112
h = HashTable()
136113

137-
h.add('a', 0)
138-
h.add('b', 1)
139-
h.add('c', 2)
114+
h.add("a", 0)
115+
h.add("b", 1)
116+
h.add("c", 2)
140117

141118
assert len(h) == 3
142-
assert h.get('a') == 0
143-
assert h.get('b') == 1
144-
assert h.get('hehe') is None
119+
assert h.get("a") == 0
120+
assert h.get("b") == 1
121+
assert h.get("hehe") is None
145122

146-
h.remove('a')
147-
assert h.get('a') is None
148-
assert sorted(list(h)) == ['b', 'c']
123+
h.remove("a")
124+
assert h.get("a") is None
125+
assert sorted(list(h)) == ["b", "c"]
149126

150127
n = 50
151128
for i in range(n):

ehco/quick_sort/sort.py

Lines changed: 0 additions & 21 deletions
This file was deleted.

ehco/sort/sort.py

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
def bubble_sort(array):
2+
"O(n2)"
3+
lens = len(array) - 1
4+
for i in range(lens):
5+
for j in range(lens - i):
6+
if array[j] > array[j + 1]:
7+
array[j], array[j + 1] = array[j + 1], array[j]
8+
return array
9+
10+
11+
def select_sort(array):
12+
"O(n2)"
13+
lens = len(array)
14+
for i in range(lens):
15+
min_idx = i
16+
for j in range(i + 1, lens):
17+
if array[j] < array[min_idx]:
18+
min_idx = j
19+
if min_idx != i:
20+
array[i], array[min_idx] = array[min_idx], array[i]
21+
return array
22+
23+
24+
def insert_sort(array):
25+
"O(n2)"
26+
lens = len(array)
27+
for i in range(1, lens):
28+
val = array[i]
29+
pos = i
30+
while pos > 0 and val < array[pos - 1]:
31+
# 把大的值往后移动
32+
array[pos] = array[pos - 1]
33+
pos -= 1
34+
array[pos] = val
35+
return array
36+
37+
38+
def quick_sort(array):
39+
size = len(array)
40+
if not array or size < 2:
41+
return array
42+
pivot_idx = 0
43+
pivot = array[pivot_idx]
44+
less_part = [array[i] for i in range(size) if array[i] <= pivot and pivot_idx != i]
45+
great_part = [array[i] for i in range(size) if array[i] > pivot and pivot_idx != i]
46+
return quick_sort(less_part) + [pivot] + quick_sort(great_part)
47+
48+
49+
def test_sort():
50+
import random
51+
52+
seq = list(range(10))
53+
random.shuffle(seq)
54+
55+
assert bubble_sort(seq) == sorted(seq)
56+
assert select_sort(seq) == sorted(seq)
57+
assert insert_sort(seq) == sorted(seq)
58+
assert quick_sort(seq) == sorted(seq)
59+

0 commit comments

Comments
 (0)