1- # 十大经典排序算法(python实现)(原创)
2- # https://www.cnblogs.com/Mufasa/p/10527387.html
3-
41sample = [2 , 15 , 5 , 9 , 7 , 6 , 4 , 12 , 5 , 4 , 1 , 64 , 5 , 6 , 4 , 2 , 3 , 54 , 45 , 4 , 44 ]
5- sample_sorted = [1 , 2 , 2 , 3 , 4 , 4 , 4 , 4 , 5 , 5 , 5 , 6 , 6 , 7 , 9 , 12 , 15 , 44 , 45 , 54 , 64 ] # 正确排序
2+ sample_sorted = [1 , 2 , 2 , 3 , 4 , 4 , 4 , 4 , 5 , 5 , 5 ,
3+ 6 , 6 , 7 , 9 , 12 , 15 , 44 , 45 , 54 , 64 ] # 正确排序
64
75print (sample )
86print (sample_sorted )
97
8+
109def assert_list (actual , expected ):
11- len1 = len (actual )
12- len2 = len (expected )
13- if len1 == len2 :
14- for i in range (max (len1 , len2 )):
15- if actual [i ] != expected [i ]: return actual
16- return 'OK'
17- return actual
10+ return 'OK' if actual == expected else actual
11+
12+
13+ # 十大经典排序算法(python实现)(原创)
14+ # https://www.cnblogs.com/Mufasa/p/10527387.html
15+
1816
1917def bubble_sort (lst ):
2018 while 1 :
@@ -26,10 +24,12 @@ def bubble_sort(lst):
2624 if not touched : # 如果没有数值交换,那么就跳出
2725 break
2826
27+
2928dt = sample [:]
3029bubble_sort (dt )
3130print ('bubble_sort: ' + str (assert_list (dt , sample_sorted )))
3231
32+
3333def selection_sort (lst ):
3434 d1 = []
3535 while len (lst ):
@@ -41,9 +41,11 @@ def selection_sort(lst):
4141 d1 .append (min [1 ]) # 在新数组中添加
4242 return d1
4343
44+
4445dt = selection_sort (sample [:])
4546print ('selection_sort: ' + str (assert_list (dt , sample_sorted )))
4647
48+
4749def direct_insertion_sort (lst ): # 直接插入排序,因为要用到后面的希尔排序,所以转成function
4850 d1 = [lst [0 ]]
4951 for i in lst [1 :]:
@@ -57,10 +59,12 @@ def direct_insertion_sort(lst): # 直接插入排序,因为要用到后面
5759 d1 .insert (0 , i )
5860 return d1
5961
62+
6063dt = direct_insertion_sort (sample [:])
6164print ('direct_insertion_sort: ' + str (assert_list (dt , sample_sorted )))
6265
63- def binary_insertion_sort (lst ): # 基于 direct_insertion_sort
66+
67+ def binary_insertion_sort (lst ):
6468 d1 = [lst [0 ]]
6569 for i in lst [1 :]:
6670 index_now = [- 1 , len (d1 )]
@@ -78,9 +82,12 @@ def binary_insertion_sort(lst): # 基于 direct_insertion_sort
7882 index_now [1 ] = index
7983 return d1
8084
85+
8186dt = binary_insertion_sort (sample [:])
8287print ('binary_insertion_sort: ' + str (assert_list (dt , sample_sorted )))
8388
89+
90+ # 基于 direct_insertion_sort
8491def shell_sort (d ): # d 为乱序数组,l为初始增量,其中l<len(d),取为len(d)/2比较好操作。最后还是直接省略length输入
8592 length = int (len (d ) / 2 ) # 10
8693 num = int (len (d ) / length ) # 2
@@ -94,14 +101,15 @@ def shell_sort(d): # d 为乱序数组,l为初始增量,其中l<len(d),取为
94101 d [i + j * length ] = d_mid [j ]
95102 length = int (length / 2 )
96103 if length == 0 :
97- return d
98104 break
99105 num = int (len (d ) / length )
100106
107+
101108dt = sample [:]
102109shell_sort (dt )
103110print ('shell_sort: ' + str (assert_list (dt , sample_sorted )))
104111
112+
105113def merge_sort (lst ): # 分治发的典型应用,大问题拆分成小问题,逐个击破,之后将结果合并
106114 half_index = int (len (lst ) / 2 ) # 将数组拆分
107115 d0 = lst [:half_index ]
@@ -126,9 +134,11 @@ def merge_sort(lst): # 分治发的典型应用,大问题拆分成小问题
126134 break
127135 return d0
128136
137+
129138dt = merge_sort (sample [:])
130139print ('merge_sort: ' + str (assert_list (dt , sample_sorted )))
131140
141+
132142def quick_sort (lst ):
133143 d = [[], [], []]
134144 d_pivot = lst [- 1 ] # 因为是乱序数组,所以第几个都是可以的,理论上是一样的
@@ -140,7 +150,6 @@ def quick_sort(lst):
140150 else : # 等于基准值的放在中间
141151 d [1 ].append (i )
142152
143- # print(d[0], d[1], d[2])
144153 if len (d [0 ]) > 1 : # 大于基准值的子数组,递归
145154 d [0 ] = quick_sort (d [0 ])
146155 if len (d [2 ]) > 1 : # 小于基准值的子数组,递归
@@ -150,16 +159,18 @@ def quick_sort(lst):
150159 d [0 ].extend (d [2 ])
151160 return d [0 ]
152161
162+
153163dt = quick_sort (sample [:])
154164print ('quick_sort: ' + str (assert_list (dt , sample_sorted )))
155165
166+
156167def counting_sort (lst ):
157168 d_max = 0
158169 d_min = 0
159170 for i in lst :
160- if d_max < i :
171+ if d_max < i :
161172 d_max = i
162- if d_min > i :
173+ if d_min > i :
163174 d_min = i
164175
165176 d1 = {}
@@ -170,24 +181,26 @@ def counting_sort(lst):
170181 d1 [i ] = 1
171182
172183 d2 = []
173- for i in range (d_min ,d_max + 1 ):
184+ for i in range (d_min , d_max + 1 ):
174185 if i in d1 .keys ():
175186 for j in range (d1 [i ]):
176187 d2 .append (i )
177188 return d2
178189
190+
179191dt = counting_sort (sample [:])
180192print ('counting_sort: ' + str (assert_list (dt , sample_sorted )))
181193
194+
182195def bucket_sort (lst ):
183196 d1 = [[] for x in range (10 )]
184197 for i in lst :
185- d1 [int (i / 10 )].append (i )
198+ d1 [int (i / 10 )].append (i )
186199 for i in range (len (d1 )):
187200 if d1 [i ] != []:
188201 d2 = [[] for x in range (10 )]
189202 for j in d1 [i ]:
190- d2 [j % 10 ].append (j )
203+ d2 [j % 10 ].append (j )
191204 d1 [i ] = d2
192205 d3 = []
193206 for i in d1 :
@@ -199,12 +212,13 @@ def bucket_sort(lst):
199212 d3 .append (k )
200213 return d3
201214
215+
202216dt = bucket_sort (sample [:])
203217print ('bucket_sort: ' + str (assert_list (dt , sample_sorted )))
204218
219+
205220def radix_sort (lst ):
206221 d1 = [[] for x in range (10 )]
207-
208222 # 第一次 最小位次排序
209223 for i in lst :
210224 d1 [i % 10 ].append (i )
@@ -213,24 +227,26 @@ def radix_sort(lst):
213227 if i :
214228 for j in i :
215229 d0_1 .append (j )
216-
217230 # 第二次 次低位排序
218231 d2 = [[] for x in range (10 )]
219232 for i in d0_1 :
220- d2 [int (i / 10 )].append (i )
233+ d2 [int (i / 10 )].append (i )
221234 d0_2 = []
222235 for i in d2 :
223236 if i :
224237 for j in i :
225238 d0_2 .append (j )
226239 return d0_2
227240
241+
228242dt = radix_sort (sample [:])
229243print ('radix_sort: ' + str (assert_list (dt , sample_sorted )))
230244
245+
231246# Python 堆排序 - 菜鸟教程
232247# https://www.runoob.com/python3/python-heap-sort.html
233248
249+
234250def heapify (arr , n , i ):
235251 largest = i
236252 l = 2 * i + 1 # left = 2*i + 1
@@ -240,9 +256,10 @@ def heapify(arr, n, i):
240256 if r < n and arr [largest ] < arr [r ]:
241257 largest = r
242258 if largest != i :
243- arr [i ],arr [largest ] = arr [largest ],arr [i ] # 交换
259+ arr [i ], arr [largest ] = arr [largest ], arr [i ] # 交换
244260 heapify (arr , n , largest )
245261
262+
246263def heap_sort (arr ):
247264 n = len (arr )
248265 # Build a maxheap.
@@ -253,6 +270,7 @@ def heap_sort(arr):
253270 arr [i ], arr [0 ] = arr [0 ], arr [i ] # 交换
254271 heapify (arr , i , 0 )
255272
273+
256274dt = sample [:]
257275heap_sort (dt )
258276print ('heap_sort: ' + str (assert_list (dt , sample_sorted )))
0 commit comments