defquicksort(arr):iflen(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 quicksort(left)+ middle + quicksort(right)# 示例使用
example_list =[3,6,8,10,1,2,1,4,7,5]
sorted_list = quicksort(example_list)print(sorted_list)# 输出: [1, 1, 2, 3, 4, 5, 6, 7, 8, 10]
5.归并排序
defmerge_sort(arr):iflen(arr)<=1:return arr
mid =len(arr)//2
left = arr[:mid]
right = arr[mid:]
left = merge_sort(left)
right = merge_sort(right)return merge(left, right)defmerge(left, right):
result =[]
i, j =0,0while i <len(left)and j <len(right):if left[i]< right[j]:
result.append(left[i])
i +=1else:
result.append(right[j])
j +=1
result += left[i:]
result += right[j:]return result
# 使用示例
arr =[5,3,4,1,2]
sorted_arr = merge_sort(arr)print(sorted_arr)# 输出: [1, 2, 3, 4, 5]
6.插入排序
definsertion_sort(arr):for i inrange(len(arr)):
pre_index = i -1
current = arr[i]while pre_index >=0and arr[pre_index]> current:
arr[pre_index +1]= arr[pre_index]
pre_index -=1
arr[pre_index +1]= current
return arr
# 示例使用
example_list =[10,5,3,8,2,6]
sorted_list = insertion_sort(example_list)print(sorted_list)# 输出: [2, 3, 5, 6, 8, 10]
7.选择排序
defselection_sort(arr):for i inrange(len(arr)):# 寻找最小元素的索引
min_idx = i
for j inrange(i+1,len(arr)):if arr[j]< arr[min_idx]:
min_idx = j
# 交换当前元素与找到的最小元素
arr[i], arr[min_idx]= arr[min_idx], arr[i]# 示例使用选择排序
example_list =[64,25,12,22,11]
selection_sort(example_list)print("Sorted array:", example_list)
deffibonacci_dp(n):if n <=1:return n
memo =[0]*(n +1)# 创建一个长度为n+1的列表用于存储计算过的值
memo[1]=1for i inrange(2, n +1):
memo[i]= memo[i -1]+ memo[i -2]# 更新子问题的解return memo[n]# 返回最终问题的解# 使用示例
n =10print(fibonacci_dp(n))# 输出为55
import networkx as nx
defprim(G, root=None):if root isNone:
root =list(G.nodes)[0]
tree = nx.Graph()
tree.add_node(root)
used ={root}
available =set(G.nodes)- used
while available:(u, v), edge_data =min(((u, v), G[u][v])for u in used for v in available if(u, v)in G.edges)
available.remove(v)
used.add(v)
tree.add_node(v)
tree.add_edge(u, v,**edge_data)return tree
# 示例:使用以下无向图
edges =[(1,2,7),(1,3,5),(1,4,3),(2,3,8),(2,5,2),(3,4,6),(3,5,9),(4,5,4),(4,6,12),(5,6,15)]
G = nx.Graph(edges)# 找到最小生成树
min_spanning_tree = prim(G)# 打印最小生成树的边print(min_spanning_tree.edges(data=True))
13.拓扑排序
from collections import defaultdict
deftopological_sort(graph):# 初始化
in_degree ={u:0for u in graph}for u in graph:for v in graph[u]:
in_degree[v]+=1
q =[u for u in graph if in_degree[u]==0]# 初始化入度为0的节点
sorted_order =[]while q:
u = q.pop()
sorted_order.append(u)for v in graph[u]:
in_degree[v]-=1if in_degree[v]==0:
q.append(v)iflen(sorted_order)!=len(graph):returnNone# 图中有环,不存在拓扑排序return sorted_order
# 示例使用
graph = defaultdict(list)
graph['A'].append('B')
graph['A'].append('C')
graph['B'].append('D')
graph['C'].append('D')
graph['D'].append('E')
sorted_order = topological_sort(graph)if sorted_order:print('拓扑排序:', sorted_order)# 输出: 拓扑排序: ['A', 'C', 'B', 'D', 'E']else:print('图中有环,不能进行拓扑排序')
deffactorial(n):if n ==0:return1else:return n * factorial(n-1)deffibonacci(n):if n <=1:return n
else:return fibonacci(n-1)+ fibonacci(n-2)# 使用方法print(factorial(5))# 计算5的阶乘print(fibonacci(10))# 计算斐波那契数列第10项的值
16.字符串匹配
defkmp_search(pattern, text):# 计算next数组next=[0for _ inrange(len(pattern))]
j =0for i inrange(1,len(pattern)):while j >0and pattern[i]!= pattern[j]:
j =next[j-1]if pattern[i]== pattern[j]:
j +=1next[i]= j
# 使用next数组进行匹配
j =0for i inrange(len(text)):while j >0and text[i]!= pattern[j]:
j =next[j-1]if text[i]== pattern[j]:
j +=1if j ==len(pattern):return i -(j -1)# 返回匹配的起始索引return-1# 如果找不到匹配,返回-1# 示例使用
pattern ="ABABD"
text ="BABABCABABCD"
index = kmp_search(pattern, text)print(f"Pattern found at index {index}")# 输出匹配的起始索引