Skip to content

Commit 26c3b67

Browse files
committed
修改命名与结构,让代码更加 Pythonic
1 parent 02064d7 commit 26c3b67

11 files changed

+231
-0
lines changed

Diff for: Search/__init__.py

Whitespace-only changes.

Diff for: Search/linear_search.py

+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
def linear_search(arr, key):
2+
"""顺序(线性)查找算法实现"""
3+
for index, value in enumerate(arr):
4+
# 寻找目标
5+
if value == key:
6+
return index

Diff for: Sort/bubble_sort.py

+29
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
#!/usr/bin/env python3
2+
# -*- coding: utf-8 -*-
3+
4+
"""冒泡排序 """
5+
6+
7+
def bubble_sort(arr):
8+
length = len(arr)
9+
for index in range(length):
10+
for j in range(1, length - index):
11+
if arr[j - 1] > arr[j]:
12+
# 交换两者数据,这里没用temp是因为python 特性元组。
13+
arr[j - 1], arr[j] = arr[j], arr[j - 1]
14+
return arr
15+
16+
17+
def bubble_sort_flag(arr):
18+
length = len(arr)
19+
for index in range(length):
20+
# 标志位
21+
flag = True
22+
for j in range(1, length - index):
23+
if arr[j - 1] > arr[j]:
24+
arr[j - 1], arr[j] = arr[j], arr[j - 1]
25+
flag = False
26+
if flag:
27+
# 没有发生交换,直接返回list
28+
return arr
29+
return arr

Diff for: Sort/count_sort.py

+23
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
#!/usr/bin/env python3
2+
# -*- coding: utf-8 -*-
3+
4+
5+
def count_sort(arr):
6+
min_num = 2147483647
7+
max_num = 0
8+
# 第一步 取得最大值和最小值
9+
for x in arr:
10+
if x < min_num:
11+
min_num = x
12+
if x > max_num:
13+
max_num = x
14+
# 创建数组C
15+
count = [0] * (max_num - min_num +1)
16+
for index in arr:
17+
count[index - min_num] += 1
18+
index = 0
19+
for a in range(max_num - min_num+1):
20+
for c in range(count[a]):
21+
arr[index] = a + min_num
22+
index += 1
23+
return arr

Diff for: Sort/heap_sort.py

+30
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
#!/usr/bin/env python3
2+
# -*- coding: utf-8 -*-
3+
4+
5+
def heap_sort(arr):
6+
# 创建最大堆
7+
for start in range((len(arr) - 2) // 2, -1, -1):
8+
sift_down(arr, start, len(arr) - 1)
9+
10+
# 堆排序
11+
for end in range(len(arr) - 1, 0, -1):
12+
arr[0], arr[end] = arr[end], arr[0]
13+
sift_down(arr, 0, end - 1)
14+
return arr
15+
16+
17+
# 最大堆调整
18+
def sift_down(arr, start, end):
19+
root = start
20+
while True:
21+
child = 2 * root + 1
22+
if child > end:
23+
break
24+
if child + 1 <= end and arr[child] < arr[child + 1]:
25+
child += 1
26+
if arr[root] < arr[child]:
27+
arr[root], arr[child] = arr[child], arr[root]
28+
root = child
29+
else:
30+
break

Diff for: Sort/insert_sort.py

+25
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
#!/usr/bin/env python3
2+
# -*- coding: utf-8 -*-
3+
4+
5+
def insert_sort(arr):
6+
n = len(arr)
7+
for i in range(1, n):
8+
# 后一个元素和前一个元素比较
9+
# 如果比前一个小
10+
if arr[i] < arr[i - 1]:
11+
# 将这个数取出
12+
temp = arr[i]
13+
# 保存下标
14+
index = i
15+
# 从后往前依次比较每个元素
16+
for j in range(i - 1, -1, -1):
17+
# 和比取出元素大的元素交换
18+
if arr[j] > temp:
19+
arr[j + 1] = arr[j]
20+
index = j
21+
else:
22+
break
23+
# 插入元素
24+
arr[index] = temp
25+
return arr

Diff for: Sort/marge_sort.py

+32
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
#!/usr/bin/env python3
2+
# -*- coding: utf-8 -*-
3+
4+
5+
def merge_sort(arr):
6+
# 认为长度不大于1的数列是有序的
7+
if len(arr) <= 1:
8+
return arr
9+
# 二分列表
10+
middle = len(arr) // 2
11+
left = merge_sort(arr[:middle])
12+
right = merge_sort(arr[middle:])
13+
# 最后一次合并
14+
return merge(left, right)
15+
16+
17+
# 合并
18+
def merge(left, right):
19+
l, r = 0, 0
20+
result = []
21+
# 两个子数列比大小
22+
while l < len(left) and r < len(right):
23+
if left[l] < right[r]:
24+
result.append(left[l])
25+
l += 1
26+
else:
27+
result.append(right[r])
28+
r += 1
29+
# 填充结果
30+
result += left[l:]
31+
result += right[r:]
32+
return result

Diff for: Sort/quick_sort.py

+38
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
#!/usr/bin/env python3
2+
# -*- coding: utf-8 -*-
3+
4+
5+
def quick_sort(arr):
6+
less = []
7+
pivot_list = []
8+
more = []
9+
# 递归出口
10+
if len(arr) <= 1:
11+
return arr
12+
else:
13+
# 将第一个值做为基准
14+
pivot = arr[0]
15+
for i in arr:
16+
# 将比急转小的值放到less数列
17+
if i < pivot:
18+
less.append(i)
19+
# 将比基准打的值放到more数列
20+
elif i > pivot:
21+
more.append(i)
22+
# 将和基准相同的值保存在基准数列
23+
else:
24+
pivot_list.append(i)
25+
# 对less数列和more数列继续进行排序
26+
less = quick_sort(less)
27+
more = quick_sort(more)
28+
return less + pivot_list + more
29+
30+
31+
def qsort(arr):
32+
if len(arr) <= 1:
33+
return arr
34+
else:
35+
pivot = arr[0]
36+
return qsort([x for x in arr[1:] if x < pivot]) + \
37+
[pivot] + \
38+
qsort([x for x in arr[1:] if x >= pivot])

Diff for: Sort/selection_sort.py

+18
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
#!/usr/bin/env python3
2+
# -*- coding: utf-8 -*-
3+
4+
5+
def selection_sort(arr):
6+
n = len(arr)
7+
# 遍历所有元素
8+
for i in range(0, n):
9+
# 获取最小元素的
10+
min_num = i
11+
# 遍历未排序元素
12+
for j in range(i + 1, n):
13+
# 找到一个比最小元素小的元素
14+
if arr[j] < arr[min_num]:
15+
min_num = j
16+
# 交换数据
17+
arr[min_num], arr[i] = arr[i], arr[min_num]
18+
return arr

Diff for: Sort/shell_sort.py

+21
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
#!/usr/bin/env python3
2+
# -*- coding: utf-8 -*-
3+
4+
5+
def shell_sort(arr):
6+
n = len(arr)
7+
# 初始步长
8+
gap = round(n / 2)
9+
while gap > 0:
10+
for i in range(gap, n):
11+
# 每个步长进行插入排序
12+
temp = arr[i]
13+
j = i
14+
# 插入排序
15+
while j >= gap and arr[j - gap] > temp:
16+
arr[j] = arr[j - gap]
17+
j -= gap
18+
arr[j] = temp
19+
# 得到新的步长
20+
gap = round(gap / 2)
21+
return arr

Diff for: Sort/test_sort.py

+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
from unittest import TestCase
2+
3+
4+
class TestSort(TestCase):
5+
6+
def test_bubble_sort(self):
7+
8+
self.fail()
9+

0 commit comments

Comments
 (0)