1
+ import random
2
+ import time
3
+ import copy
4
+ size1 = 100
5
+ size2 = 10000
6
+ size3 = 1000000
7
+ span = 1000000
8
+ threshold = 20
9
+
10
+ #---------------------------------------
11
+ # Insertion Sort
12
+ #---------------------------------------
13
+ # not optimized, equiv to while version below, but uses for loop
14
+ def insertion_sort1 (A ):
15
+ for i in range (1 , len (A )):
16
+ for j in range (i - 1 , 0 , - 1 ):
17
+ if A [j ] > A [j + 1 ]:
18
+ A [j ], A [j + 1 ] = A [j + 1 ], A [j ]
19
+ else :
20
+ break
21
+
22
+ # not optimized, equiv to break version, but uses while loop
23
+ def insertion_sort2 (A ):
24
+ for i in range (1 , len (A )):
25
+ j = i - 1
26
+ while A [j ] > A [j + 1 ] and j >= 0 :
27
+ A [j ], A [j + 1 ] = A [j + 1 ], A [j ]
28
+ j -= 1
29
+
30
+ # optimized - shifts instead of swapping
31
+ def insertion_sort3 (A ):
32
+ for i in range (1 , len (A )):
33
+ curNum = A [i ]
34
+ k = 0
35
+ for j in range (i - 1 , - 2 , - 1 ):
36
+ k = j
37
+ if A [j ] > curNum :
38
+ A [j + 1 ] = A [j ]
39
+ else :
40
+ break
41
+ A [k + 1 ] = curNum
42
+
43
+ #---------------------------------------
44
+ # Selection Sort
45
+ #---------------------------------------
46
+ def selection_sort (A ):
47
+ for i in range (0 , len (A ) - 1 ):
48
+ minIndex = i
49
+ for j in range (i + 1 , len (A )):
50
+ if A [j ] < A [minIndex ]:
51
+ minIndex = j
52
+ if minIndex != i :
53
+ A [i ], A [minIndex ] = A [minIndex ], A [i ]
54
+
55
+ #---------------------------------------
56
+ # Bubble Sort
57
+ #---------------------------------------
58
+ # not optimized
59
+ def bubble_sort1 (A ):
60
+ for i in range (0 , len (A ) - 1 ):
61
+ for j in range (0 , len (A ) - i - 1 ):
62
+ if A [j ] > A [j + 1 ]:
63
+ A [j ], A [j + 1 ] = A [j + 1 ], A [j ]
64
+
65
+ # optimized to exit if no swaps occur
66
+ def bubble_sort2 (A ):
67
+ for i in range (0 , len (A ) - 1 ):
68
+ done = True
69
+ for j in range (0 , len (A ) - i - 1 ):
70
+ if A [j ] > A [j + 1 ]:
71
+ A [j ], A [j + 1 ] = A [j + 1 ], A [j ]
72
+ done = False
73
+ if done :
74
+ return
75
+
76
+ #---------------------------------------
77
+ # Merge Sort
78
+ #---------------------------------------
79
+ def merge_sort (A ):
80
+ merge_sort2 (A , 0 , len (A )- 1 )
81
+
82
+ def merge_sort2 (A , first , last ):
83
+ if last - first < threshold and first < last :
84
+ quick_selection (A , first , last )
85
+ elif first < last :
86
+ middle = (first + last )// 2
87
+ merge_sort2 (A , first , middle )
88
+ merge_sort2 (A , middle + 1 , last )
89
+ merge (A , first , middle , last )
90
+
91
+ def merge (A , first , middle , last ):
92
+ L = A [first :middle ]
93
+ R = A [middle :last + 1 ]
94
+ L .append (999999999 )
95
+ R .append (999999999 )
96
+ i = j = 0
97
+
98
+ for k in range (first , last + 1 ):
99
+ if L [i ] <= R [j ]:
100
+ A [k ] = L [i ]
101
+ i += 1
102
+ else :
103
+ A [k ] = R [j ]
104
+ j += 1
105
+ #---------------------------------------
106
+ # Quick Sort
107
+ #---------------------------------------
108
+ def quick_sort (A ):
109
+ quick_sort2 (A , 0 , len (A )- 1 )
110
+
111
+ def quick_sort2 (A , low , hi ):
112
+ if hi - low < threshold and low < hi :
113
+ quick_selection (A , low , hi )
114
+ elif low < hi :
115
+ p = partition (A , low , hi )
116
+ quick_sort2 (A , low , p - 1 )
117
+ quick_sort2 (A , p + 1 , hi )
118
+
119
+ def get_pivot (A , low , hi ):
120
+ mid = (hi + low ) // 2
121
+ pivot = hi
122
+ if low < mid :
123
+ if mid < hi :
124
+ pivot = mid
125
+ elif low < hi :
126
+ pivot = low
127
+
128
+ return pivot
129
+
130
+ def partition (A , low , hi ):
131
+ pivotIndex = get_pivot (A , low , hi )
132
+ pivotValue = A [pivotIndex ]
133
+ A [pivotIndex ], A [low ] = A [low ], A [pivotIndex ]
134
+ border = low
135
+
136
+ for i in range (low , hi + 1 ):
137
+ if A [i ] < pivotValue :
138
+ border += 1
139
+ A [i ], A [border ] = A [border ], A [i ]
140
+ A [low ], A [border ] = A [border ], A [low ]
141
+
142
+ return (border )
143
+
144
+ def quick_selection (x , first , last ):
145
+ for i in range (first , last ):
146
+ minIndex = i
147
+ for j in range (i + 1 , last + 1 ):
148
+ if x [j ] < x [minIndex ]:
149
+ minIndex = j
150
+ if minIndex != i :
151
+ x [i ], x [minIndex ] = x [minIndex ], x [i ]
152
+
153
+ #--------------RANDOM ORDER----------------------
154
+ #------------------------------------------------
155
+ # size = 100
156
+ #------------------------------------------------
157
+ print ("\n Random Order\n ---------------------------------" )
158
+ w = [random .randint (0 , span ) for a in range (0 , size1 )]
159
+ t1 = time .clock ()
160
+ insertion_sort3 (w )
161
+ print ("Insertion Sort(size=" , str (size1 ),"): " , (time .clock ()- t1 ) * 1000 )
162
+
163
+ w = [random .randint (0 , span ) for a in range (0 , size1 )]
164
+ t1 = time .clock ()
165
+ selection_sort (w )
166
+ print ("Selection Sort(size=" , str (size1 ),"): " , (time .clock ()- t1 ) * 1000 )
167
+
168
+ w = [random .randint (0 , span ) for a in range (0 , size1 )]
169
+ t1 = time .clock ()
170
+ bubble_sort2 (w )
171
+ print ("Bubble Sort(size=" , str (size1 ),"): " , (time .clock ()- t1 ) * 1000 )
172
+
173
+ w = [random .randint (0 , span ) for a in range (0 , size1 )]
174
+ t1 = time .clock ()
175
+ merge_sort (w )
176
+ print ("Merge Sort(size=" , str (size1 ),"): " , (time .clock ()- t1 ) * 1000 )
177
+
178
+ w = [random .randint (0 , span ) for a in range (0 , size1 )]
179
+ t1 = time .clock ()
180
+ quick_sort (w )
181
+ print ("Quick Sort(size=" , str (size1 ),"): " , (time .clock ()- t1 ) * 1000 )
182
+
183
+ w = [random .randint (0 , span ) for a in range (0 , size1 )]
184
+ t1 = time .clock ()
185
+ w .sort ()
186
+ print ("Tim Sort(size=" , str (size1 ),"): " , (time .clock ()- t1 ) * 1000 )
187
+ #------------------------------------------------
188
+ # size = 10,000
189
+ #------------------------------------------------
190
+ w = [random .randint (0 , span ) for a in range (0 , size2 )]
191
+ t1 = time .clock ()
192
+ insertion_sort3 (w )
193
+ print ("Insertion Sort(size=" , str (size2 ),"): " , (time .clock ()- t1 ) * 1000 )
194
+
195
+ w = [random .randint (0 , span ) for a in range (0 , size2 )]
196
+ t1 = time .clock ()
197
+ selection_sort (w )
198
+ print ("Selection Sort(size=" , str (size2 ),"): " , (time .clock ()- t1 ) * 1000 )
199
+
200
+ w = [random .randint (0 , span ) for a in range (0 , size2 )]
201
+ t1 = time .clock ()
202
+ bubble_sort2 (w )
203
+ print ("Bubble Sort(size=" , str (size2 ),"): " , (time .clock ()- t1 ) * 1000 )
204
+
205
+ w = [random .randint (0 , span ) for a in range (0 , size2 )]
206
+ t1 = time .clock ()
207
+ merge_sort (w )
208
+ print ("Merge Sort(size=" , str (size2 ),"): " , (time .clock ()- t1 ) * 1000 )
209
+
210
+ w = [random .randint (0 , span ) for a in range (0 , size2 )]
211
+ t1 = time .clock ()
212
+ quick_sort (w )
213
+ print ("Quick Sort(size=" , str (size2 ),"): " , (time .clock ()- t1 ) * 1000 )
214
+
215
+ w = [random .randint (0 , span ) for a in range (0 , size2 )]
216
+ t1 = time .clock ()
217
+ w .sort ()
218
+ print ("Tim Sort(size=" , str (size2 ),"): " , (time .clock ()- t1 ) * 1000 )
219
+ #------------------------------------------------
220
+ # size = 1,000,000
221
+ #------------------------------------------------
222
+ w = [random .randint (0 , span ) for a in range (0 , size3 )]
223
+ t1 = time .clock ()
224
+ merge_sort (w )
225
+ print ("Merge Sort(size=" , str (size3 ),"): " , (time .clock ()- t1 ) * 1000 )
226
+
227
+ w = [random .randint (0 , span ) for a in range (0 , size3 )]
228
+ t1 = time .clock ()
229
+ quick_sort (w )
230
+ print ("Quick Sort(size=" , str (size3 ),"): " , (time .clock ()- t1 ) * 1000 )
231
+
232
+ w = [random .randint (0 , span ) for a in range (0 , size3 )]
233
+ t1 = time .clock ()
234
+ w .sort ()
235
+ print ("Tim Sort(size=" , str (size3 ),"): " , (time .clock ()- t1 ) * 1000 )
236
+
237
+ # ----------------ALREADY SORTED-----------------
238
+ #------------------------------------------------
239
+ # size = 10,000
240
+ #------------------------------------------------
241
+ print ("\n Already Sorted\n ---------------------------------" )
242
+
243
+ w = [a for a in range (0 , size2 )]
244
+ t1 = time .clock ()
245
+ insertion_sort3 (w )
246
+ print ("Insertion Sort(size=" , str (size2 ),"): " , (time .clock ()- t1 ) * 1000 )
247
+
248
+ t1 = time .clock ()
249
+ selection_sort (w )
250
+ print ("Selection Sort(size=" , str (size2 ),"): " , (time .clock ()- t1 ) * 1000 )
251
+
252
+ t1 = time .clock ()
253
+ bubble_sort2 (w )
254
+ print ("Bubble Sort(size=" , str (size2 ),"): " , (time .clock ()- t1 ) * 1000 )
255
+
256
+ t1 = time .clock ()
257
+ merge_sort (w )
258
+ print ("Merge Sort(size=" , str (size2 ),"): " , (time .clock ()- t1 ) * 1000 )
259
+
260
+ t1 = time .clock ()
261
+ quick_sort (w )
262
+ print ("Quick Sort(size=" , str (size2 ),"): " , (time .clock ()- t1 ) * 1000 )
263
+
264
+ t1 = time .clock ()
265
+ w .sort ()
266
+ print ("Tim Sort(size=" , str (size2 ),"): " , (time .clock ()- t1 ) * 1000 )
267
+ #------------------------------------------------
268
+ # size = 1,000,000
269
+ #------------------------------------------------
270
+ w = [a for a in range (0 , size3 )]
271
+ t1 = time .clock ()
272
+ merge_sort (w )
273
+ print ("Merge Sort(size=" , str (size3 ),"): " , (time .clock ()- t1 ) * 1000 )
274
+
275
+ t1 = time .clock ()
276
+ quick_sort (w )
277
+ print ("Quick Sort(size=" , str (size3 ),"): " , (time .clock ()- t1 ) * 1000 )
278
+
279
+ t1 = time .clock ()
280
+ w .sort ()
281
+ print ("Tim Sort(size=" , str (size3 ),"): " , (time .clock ()- t1 ) * 1000 )
282
+
283
+ # ----------------REVERSE SORTED-----------------
284
+ #------------------------------------------------
285
+ # size = 10,000
286
+ #------------------------------------------------
287
+ print ("\n Reverse Sorted\n ---------------------------------" )
288
+
289
+ w = [a for a in range (0 , size2 )]
290
+ w .reverse ()
291
+ t1 = time .clock ()
292
+ insertion_sort3 (w )
293
+ print ("Insertion Sort(size=" , str (size2 ),"): " , (time .clock ()- t1 ) * 1000 )
294
+
295
+ w = [a for a in range (0 , size2 )]
296
+ w .reverse ()
297
+ t1 = time .clock ()
298
+ selection_sort (w )
299
+ print ("Selection Sort(size=" , str (size2 ),"): " , (time .clock ()- t1 ) * 1000 )
300
+
301
+ w = [a for a in range (0 , size2 )]
302
+ w .reverse ()
303
+ t1 = time .clock ()
304
+ bubble_sort2 (w )
305
+ print ("Bubble Sort(size=" , str (size2 ),"): " , (time .clock ()- t1 ) * 1000 )
306
+
307
+ w = [a for a in range (0 , size2 )]
308
+ w .reverse ()
309
+ t1 = time .clock ()
310
+ merge_sort (w )
311
+ print ("Merge Sort(size=" , str (size2 ),"): " , (time .clock ()- t1 ) * 1000 )
312
+
313
+ w = [a for a in range (0 , size2 )]
314
+ w .reverse ()
315
+ t1 = time .clock ()
316
+ quick_sort (w )
317
+ print ("Quick Sort(size=" , str (size2 ),"): " , (time .clock ()- t1 ) * 1000 )
318
+
319
+ w = [a for a in range (0 , size2 )]
320
+ w .reverse ()
321
+ t1 = time .clock ()
322
+ w .sort ()
323
+ print ("Tim Sort(size=" , str (size2 ),"): " , (time .clock ()- t1 ) * 1000 )
324
+ #------------------------------------------------
325
+ # size = 1,000,000
326
+ #------------------------------------------------
327
+ w = [a for a in range (0 , size3 )]
328
+ w .reverse ()
329
+ t1 = time .clock ()
330
+ merge_sort (w )
331
+ print ("Merge Sort(size=" , str (size3 ),"): " , (time .clock ()- t1 ) * 1000 )
332
+
333
+ w = [a for a in range (0 , size3 )]
334
+ w .reverse ()
335
+ t1 = time .clock ()
336
+ quick_sort (w )
337
+ print ("Quick Sort(size=" , str (size3 ),"): " , (time .clock ()- t1 ) * 1000 )
338
+
339
+ w = [a for a in range (0 , size3 )]
340
+ w .reverse ()
341
+ t1 = time .clock ()
342
+ w .sort ()
343
+ print ("Tim Sort(size=" , str (size3 ),"): " , (time .clock ()- t1 ) * 1000 )
344
+
345
+ #--------------RANDOM ORDER, MANY DUPLICATES------------------
346
+ #------------------------------------------------
347
+ # size = 10,000
348
+ #------------------------------------------------
349
+ print ("\n Random Order, Many Duplicates\n ---------------------------------" )
350
+
351
+ w = [random .randint (0 , size2 // 10 ) for a in range (0 , size2 )]
352
+ t1 = time .clock ()
353
+ insertion_sort3 (w )
354
+ print ("Insertion Sort(size=" , str (size2 ),"): " , (time .clock ()- t1 ) * 1000 )
355
+
356
+ w = [random .randint (0 , size2 // 10 ) for a in range (0 , size2 )]
357
+ t1 = time .clock ()
358
+ selection_sort (w )
359
+ print ("Selection Sort(size=" , str (size2 ),"): " , (time .clock ()- t1 ) * 1000 )
360
+
361
+ w = [random .randint (0 ,size2 // 10 ) for a in range (0 , size2 )]
362
+ t1 = time .clock ()
363
+ bubble_sort2 (w )
364
+ print ("Bubble Sort(size=" , str (size2 ),"): " , (time .clock ()- t1 ) * 1000 )
365
+
366
+ w = [random .randint (0 , size2 // 10 ) for a in range (0 , size2 )]
367
+ t1 = time .clock ()
368
+ merge_sort (w )
369
+ print ("Merge Sort(size=" , str (size2 ),"): " , (time .clock ()- t1 ) * 1000 )
370
+
371
+ w = [random .randint (0 , size2 // 10 ) for a in range (0 , size2 )]
372
+ t1 = time .clock ()
373
+ quick_sort (w )
374
+ print ("Quick Sort(size=" , str (size2 ),"): " , (time .clock ()- t1 ) * 1000 )
375
+
376
+ w = [random .randint (0 , size2 // 10 ) for a in range (0 , size2 )]
377
+ t1 = time .clock ()
378
+ w .sort ()
379
+ print ("Tim Sort(size=" , str (size2 ),"): " , (time .clock ()- t1 ) * 1000 )
380
+ #------------------------------------------------
381
+ # size = 1,000,000
382
+ #------------------------------------------------
383
+ w = [random .randint (0 , size2 // 10 ) for a in range (0 , size3 )]
384
+ t1 = time .clock ()
385
+ merge_sort (w )
386
+ print ("Merge Sort(size=" , str (size3 ),"): " , (time .clock ()- t1 ) * 1000 )
387
+
388
+ w = [random .randint (0 , size2 // 10 ) for a in range (0 , size3 )]
389
+ t1 = time .clock ()
390
+ #quick_sort(w)
391
+ #print("Quick Sort(size=", str(size3),"): ", (time.clock()-t1) * 1000)
392
+
393
+ w = [random .randint (0 , size2 // 10 ) for a in range (0 , size3 )]
394
+ t1 = time .clock ()
395
+ w .sort ()
396
+ print ("Tim Sort(size=" , str (size3 ),"): " , (time .clock ()- t1 ) * 1000 )
0 commit comments