1. 冒泡排序
目标:排序算法入门,理解基本排序原理
def bubble_sort(arr):
"""冒泡排序 - 逐一比较相邻元素"""
n = len(arr)
for i in range(n):
swapped = False
for j in range(0, n - i - 1):
if arr[j] > arr[j + 1]:
arr[j], arr[j + 1] = arr[j + 1], arr[j]
swapped = True
if not swapped:
break
return arr
# 测试
print(bubble_sort([64, 34, 25, 12, 22, 11, 90]))
# 输出: [11, 12, 22, 25, 34, 64, 90]
知识点:双重循环、相邻比较、优化提前终止
2. 二分查找
目标:掌握高效搜索算法,时间复杂度 O(log n)
def binary_search(arr, target):
"""二分查找 - 高效搜索有序列表"""
left, right = 0, len(arr) - 1
while left <= right:
mid = (left + right) // 2
if arr[mid] == target:
return mid
elif arr[mid] < target:
left = mid + 1
else:
right = mid - 1
return -1
# 测试
arr = [1, 3, 5, 7, 9, 11, 13]
print(binary_search(arr, 7)) # 输出: 3
print(binary_search(arr, 4)) # 输出: -1
知识点:左右指针、区间缩小、对数时间复杂度
3. 快速排序
目标:分治法经典应用,平均 O(n log n) 排序
def quick_sort(arr):
"""快速排序 - 分治法经典"""
if len(arr) <= 1:
return arr
pivot = arr[len(arr) // 2]
left = [x for x in arr if x < pivot]
middle = [x for x in arr if x == pivot]
right = [x for x in arr if x > pivot]
return quick_sort(left) + middle + quick_sort(right)
# 测试
print(quick_sort([3, 6, 8, 10, 1, 2, 1]))
# 输出: [1, 1, 2, 3, 6, 8, 10]
知识点:分治思想、基准点选择、递归实现
4. 归并排序
目标:实现分治法经典排序算法
def merge_sort(arr):
if len(arr) <= 1:
return arr
mid = len(arr) // 2
left = merge_sort(arr[:mid])
right = merge_sort(arr[mid:])
return merge(left, right)
def merge(left, right):
result = []
i = j = 0
while i < len(left) and j < len(right):
if left[i] <= right[j]:
result.append(left[i])
i += 1
else:
result.append(right[j])
j += 1
result.extend(left[i:])
result.extend(right[j:])
return result
# 测试
data = [38, 27, 43, 3, 9, 82, 10]
print(f"排序前: {data}")
print(f"排序后: {merge_sort(data)}")
知识点:分治法、递归、列表合并
5. 动态规划 - 背包问题
目标:实现 0-1 背包问题
def knapsack(weights, values, capacity):
n = len(weights)
dp = [[0] * (capacity + 1) for _ in range(n + 1)]
for i in range(1, n + 1):
for w in range(capacity + 1):
if weights[i-1] <= w:
dp[i][w] = max(
dp[i-1][w],
dp[i-1][w - weights[i-1]] + values[i-1]
)
else:
dp[i][w] = dp[i-1][w]
# 回溯找出选了哪些物品
result = []
w = capacity
for i in range(n, 0, -1):
if dp[i][w] != dp[i-1][w]:
result.append(i - 1)
w -= weights[i - 1]
return dp[n][capacity], result
weights = [2, 3, 4, 5]
values = [3, 4, 5, 6]
capacity = 8
max_value, items = knapsack(weights, values, capacity)
print(f"最大价值: {max_value}")
print(f"选择物品索引: {items}")
知识点:动态规划、二维 DP 表、回溯路径
6. 广度优先搜索(BFS)
目标:实现图的 BFS 遍历和最短路径
from collections import deque
def bfs(graph, start, target):
queue = deque([(start, [start])])
visited = {start}
while queue:
node, path = queue.popleft()
if node == target:
return path
for neighbor in graph[node]:
if neighbor not in visited:
visited.add(neighbor)
queue.append((neighbor, path + [neighbor]))
return None
# 图的邻接表
graph = {
'A': ['B', 'C'],
'B': ['A', 'D', 'E'],
'C': ['A', 'F'],
'D': ['B'],
'E': ['B', 'F'],
'F': ['C', 'E', 'G'],
'G': ['F']
}
path = bfs(graph, 'A', 'G')
print(f"最短路径: {' → '.join(path)}")
print(f"路径长度: {len(path) - 1}")
知识点:BFS、队列、邻接表、最短路径