1
+ """
2
+
3
+ 编程拓展课实验作业
4
+
5
+ 时间: 9/18
6
+
7
+ """
8
+
9
+
10
+ # ? 1.About the sort
11
+ # 1.1 bubble_sort
12
+
13
+ def bubble_sort (arr ):
14
+ n = len (arr )
15
+ for i in range (n ):
16
+ #? Flag whether this data has been exchanged or not.If it's True which means exchanged.
17
+ swapped = False
18
+ #? After each traversal,the biggest element form this time arr will go to the end.
19
+ for j in range (0 , n - i - 1 ):
20
+ if arr [j ] > arr [j + 1 ]:
21
+ arr [j ], arr [j + 1 ] = arr [j + 1 ], arr [j ] #the exchange grammar in python
22
+ swapped = True
23
+ # if the arr ont exchanged,that means arr already orderly
24
+ if not swapped :
25
+ break
26
+ return arr
27
+
28
+ # Example use
29
+
30
+ if __name__ == "__main__" :
31
+ print ("冒泡排序:" )
32
+ U_list = [12 ,11 ,56 ,7 ,98 ,77 ,66 ]
33
+ print ("Original list:" , U_list )
34
+ sort_list = bubble_sort (U_list )
35
+ print ("sorted list:" ,sort_list )
36
+
37
+ # 1.2 堆排序
38
+
39
+ def heapify (arr , n , i ):
40
+ largest = i # 初始化最大值为根节点
41
+ left = 2 * i + 1 # 左子节点
42
+ right = 2 * i + 2 # 右子节点
43
+
44
+ # 如果左子节点比根节点大
45
+ if left < n and arr [left ] > arr [largest ]:
46
+ largest = left
47
+
48
+ # 如果右子节点比当前最大的还大
49
+ if right < n and arr [right ] > arr [largest ]:
50
+ largest = right
51
+
52
+ # 如果最大值不是根节点
53
+ if largest != i :
54
+ arr [i ], arr [largest ] = arr [largest ], arr [i ] # 交换
55
+ heapify (arr , n , largest ) # 递归调用
56
+
57
+ def heap_sort (arr ):
58
+ n = len (arr )
59
+
60
+ # 构建最大堆
61
+ for i in range (n // 2 - 1 , - 1 , - 1 ):
62
+ heapify (arr , n , i )
63
+
64
+ # 一个个取出元素
65
+ for i in range (n - 1 , 0 , - 1 ):
66
+ arr [i ], arr [0 ] = arr [0 ], arr [i ] # 交换
67
+ heapify (arr , i , 0 )
68
+
69
+ return arr
70
+
71
+ # 示例使用
72
+ if __name__ == "__main__" :
73
+ print ("堆排序:" )
74
+ sample_list = [12 , 11 , 13 , 5 , 6 , 7 ]
75
+ print ("原始列表:" , sample_list )
76
+ sorted_list = heap_sort (sample_list )
77
+ print ("排序后列表:" , sorted_list )
78
+
79
+
80
+
81
+ # 1.3 插入排序
82
+
83
+ def insertion_sort (arr ):
84
+ for i in range (1 , len (arr )):
85
+ key = arr [i ] # 当前待插入的元素
86
+ j = i - 1
87
+ # 将arr[i]插入到已排序部分的正确位置
88
+ while j >= 0 and arr [j ] > key :
89
+ arr [j + 1 ] = arr [j ] # 移动元素
90
+ j -= 1
91
+ arr [j + 1 ] = key # 插入
92
+
93
+ return arr
94
+
95
+ # 示例使用
96
+ if __name__ == "__main__" :
97
+ print ("插入排序:" )
98
+ sample_list = [31 , 41 , 59 , 26 , 41 , 58 ]
99
+ print ("原始列表:" , sample_list )
100
+ sorted_list = insertion_sort (sample_list )
101
+ print ("排序后列表:" , sorted_list )
102
+
103
+
104
+ # 1.4 选择排序
105
+
106
+ def selection_sort (arr ):
107
+ n = len (arr )
108
+ for i in range (n ):
109
+ # 假设当前索引为最小值
110
+ min_idx = i
111
+ # 在剩下的元素中寻找最小值
112
+ for j in range (i + 1 , n ):
113
+ if arr [j ] < arr [min_idx ]:
114
+ min_idx = j
115
+ # 交换找到的最小值与当前位置的值
116
+ arr [i ], arr [min_idx ] = arr [min_idx ], arr [i ]
117
+ return arr
118
+
119
+ # 示例使用
120
+ if __name__ == "__main__" :
121
+ print ("选择排序:" )
122
+ sample_list = [64 , 25 , 12 , 22 , 11 ]
123
+ print ("原始列表:" , sample_list )
124
+ sorted_list = selection_sort (sample_list )
125
+ print ("排序后列表:" , sorted_list )
0 commit comments