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, -1, -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
+ s = sorted([A[low], A[mid], A[hi]])
122
+ if s[1] == A[low]:
123
+ return low
124
+ elif s[1] == A[mid]:
125
+ return mid
126
+ return hi
127
+
128
+ def partition(A, low, hi):
129
+ pivotIndex = get_pivot(A, low, hi)
130
+ pivotValue = A[pivotIndex]
131
+ A[pivotIndex], A[low] = A[low], A[pivotIndex]
132
+ border = low
133
+
134
+ for i in range(low, hi+1):
135
+ if A[i] < pivotValue:
136
+ border += 1
137
+ A[i], A[border] = A[border], A[i]
138
+ A[low], A[border] = A[border], A[low]
139
+
140
+ return (border)
141
+
142
+ def quick_selection(x, first, last):
143
+ for i in range (first, last):
144
+ minIndex = i
145
+ for j in range (i+1, last+1):
146
+ if x[j] < x[minIndex]:
147
+ minIndex = j
148
+ if minIndex != i:
149
+ x[i], x[minIndex] = x[minIndex], x[i]
150
+
151
+ #--------------RANDOM ORDER----------------------
152
+ #------------------------------------------------
153
+ # size = 100
154
+ #------------------------------------------------
155
+ print("\nRandom Order\n---------------------------------")
156
+ w = [random.randint(0, span) for a in range(0, size1)]
157
+ t1 = time.clock()
158
+ insertion_sort3(w)
159
+ print("Insertion Sort(size=", str(size1),"): ", (time.clock()-t1) * 1000)
160
+
161
+ w = [random.randint(0, span) for a in range(0, size1)]
162
+ t1 = time.clock()
163
+ selection_sort(w)
164
+ print("Selection Sort(size=", str(size1),"): ", (time.clock()-t1) * 1000)
165
+
166
+ w = [random.randint(0, span) for a in range(0, size1)]
167
+ t1 = time.clock()
168
+ bubble_sort2(w)
169
+ print("Bubble Sort(size=", str(size1),"): ", (time.clock()-t1) * 1000)
170
+
171
+ w = [random.randint(0, span) for a in range(0, size1)]
172
+ t1 = time.clock()
173
+ merge_sort(w)
174
+ print("Merge Sort(size=", str(size1),"): ", (time.clock()-t1) * 1000)
175
+
176
+ w = [random.randint(0, span) for a in range(0, size1)]
177
+ t1 = time.clock()
178
+ quick_sort(w)
179
+ print("Quick Sort(size=", str(size1),"): ", (time.clock()-t1) * 1000)
180
+
181
+ w = [random.randint(0, span) for a in range(0, size1)]
182
+ t1 = time.clock()
183
+ w.sort()
184
+ print("Tim Sort(size=", str(size1),"): ", (time.clock()-t1) * 1000)
185
+ #------------------------------------------------
186
+ # size = 10,000
187
+ #------------------------------------------------
188
+ w = [random.randint(0, span) for a in range(0, size2)]
189
+ t1 = time.clock()
190
+ insertion_sort3(w)
191
+ print("Insertion Sort(size=", str(size2),"): ", (time.clock()-t1) * 1000)
192
+
193
+ w = [random.randint(0, span) for a in range(0, size2)]
194
+ t1 = time.clock()
195
+ selection_sort(w)
196
+ print("Selection Sort(size=", str(size2),"): ", (time.clock()-t1) * 1000)
197
+
198
+ w = [random.randint(0, span) for a in range(0, size2)]
199
+ t1 = time.clock()
200
+ bubble_sort2(w)
201
+ print("Bubble Sort(size=", str(size2),"): ", (time.clock()-t1) * 1000)
202
+
203
+ w = [random.randint(0, span) for a in range(0, size2)]
204
+ t1 = time.clock()
205
+ merge_sort(w)
206
+ print("Merge Sort(size=", str(size2),"): ", (time.clock()-t1) * 1000)
207
+
208
+ w = [random.randint(0, span) for a in range(0, size2)]
209
+ t1 = time.clock()
210
+ quick_sort(w)
211
+ print("Quick Sort(size=", str(size2),"): ", (time.clock()-t1) * 1000)
212
+
213
+ w = [random.randint(0, span) for a in range(0, size2)]
214
+ t1 = time.clock()
215
+ w.sort()
216
+ print("Tim Sort(size=", str(size2),"): ", (time.clock()-t1) * 1000)
217
+ #------------------------------------------------
218
+ # size = 1,000,000
219
+ #------------------------------------------------
220
+ w = [random.randint(0, span) for a in range(0, size3)]
221
+ t1 = time.clock()
222
+ merge_sort(w)
223
+ print("Merge Sort(size=", str(size3),"): ", (time.clock()-t1) * 1000)
224
+
225
+ w = [random.randint(0, span) for a in range(0, size3)]
226
+ t1 = time.clock()
227
+ quick_sort(w)
228
+ print("Quick Sort(size=", str(size3),"): ", (time.clock()-t1) * 1000)
229
+
230
+ w = [random.randint(0, span) for a in range(0, size3)]
231
+ t1 = time.clock()
232
+ w.sort()
233
+ print("Tim Sort(size=", str(size3),"): ", (time.clock()-t1) * 1000)
234
+
235
+ # ----------------ALREADY SORTED-----------------
236
+ #------------------------------------------------
237
+ # size = 10,000
238
+ #------------------------------------------------
239
+ print("\nAlready Sorted\n---------------------------------")
240
+
241
+ w = [a for a in range(0, size2)]
242
+ t1 = time.clock()
243
+ insertion_sort3(w)
244
+ print("Insertion Sort(size=", str(size2),"): ", (time.clock()-t1) * 1000)
245
+
246
+ t1 = time.clock()
247
+ selection_sort(w)
248
+ print("Selection Sort(size=", str(size2),"): ", (time.clock()-t1) * 1000)
249
+
250
+ t1 = time.clock()
251
+ bubble_sort2(w)
252
+ print("Bubble Sort(size=", str(size2),"): ", (time.clock()-t1) * 1000)
253
+
254
+ t1 = time.clock()
255
+ merge_sort(w)
256
+ print("Merge Sort(size=", str(size2),"): ", (time.clock()-t1) * 1000)
257
+
258
+ t1 = time.clock()
259
+ quick_sort(w)
260
+ print("Quick Sort(size=", str(size2),"): ", (time.clock()-t1) * 1000)
261
+
262
+ t1 = time.clock()
263
+ w.sort()
264
+ print("Tim Sort(size=", str(size2),"): ", (time.clock()-t1) * 1000)
265
+ #------------------------------------------------
266
+ # size = 1,000,000
267
+ #------------------------------------------------
268
+ w = [a for a in range(0, size3)]
269
+ t1 = time.clock()
270
+ merge_sort(w)
271
+ print("Merge Sort(size=", str(size3),"): ", (time.clock()-t1) * 1000)
272
+
273
+ t1 = time.clock()
274
+ quick_sort(w)
275
+ print("Quick Sort(size=", str(size3),"): ", (time.clock()-t1) * 1000)
276
+
277
+ t1 = time.clock()
278
+ w.sort()
279
+ print("Tim Sort(size=", str(size3),"): ", (time.clock()-t1) * 1000)
280
+
281
+ # ----------------REVERSE SORTED-----------------
282
+ #------------------------------------------------
283
+ # size = 10,000
284
+ #------------------------------------------------
285
+ print("\nReverse Sorted\n---------------------------------")
286
+
287
+ w = [a for a in range(0, size2)]
288
+ w.reverse()
289
+ t1 = time.clock()
290
+ insertion_sort3(w)
291
+ print("Insertion Sort(size=", str(size2),"): ", (time.clock()-t1) * 1000)
292
+
293
+ w = [a for a in range(0, size2)]
294
+ w.reverse()
295
+ t1 = time.clock()
296
+ selection_sort(w)
297
+ print("Selection Sort(size=", str(size2),"): ", (time.clock()-t1) * 1000)
298
+
299
+ w = [a for a in range(0, size2)]
300
+ w.reverse()
301
+ t1 = time.clock()
302
+ bubble_sort2(w)
303
+ print("Bubble Sort(size=", str(size2),"): ", (time.clock()-t1) * 1000)
304
+
305
+ w = [a for a in range(0, size2)]
306
+ w.reverse()
307
+ t1 = time.clock()
308
+ merge_sort(w)
309
+ print("Merge Sort(size=", str(size2),"): ", (time.clock()-t1) * 1000)
310
+
311
+ w = [a for a in range(0, size2)]
312
+ w.reverse()
313
+ t1 = time.clock()
314
+ quick_sort(w)
315
+ print("Quick Sort(size=", str(size2),"): ", (time.clock()-t1) * 1000)
316
+
317
+ w = [a for a in range(0, size2)]
318
+ w.reverse()
319
+ t1 = time.clock()
320
+ w.sort()
321
+ print("Tim Sort(size=", str(size2),"): ", (time.clock()-t1) * 1000)
322
+ #------------------------------------------------
323
+ # size = 1,000,000
324
+ #------------------------------------------------
325
+ w = [a for a in range(0, size3)]
326
+ w.reverse()
327
+ t1 = time.clock()
328
+ merge_sort(w)
329
+ print("Merge Sort(size=", str(size3),"): ", (time.clock()-t1) * 1000)
330
+
331
+ w = [a for a in range(0, size3)]
332
+ w.reverse()
333
+ t1 = time.clock()
334
+ quick_sort(w)
335
+ print("Quick Sort(size=", str(size3),"): ", (time.clock()-t1) * 1000)
336
+
337
+ w = [a for a in range(0, size3)]
338
+ w.reverse()
339
+ t1 = time.clock()
340
+ w.sort()
341
+ print("Tim Sort(size=", str(size3),"): ", (time.clock()-t1) * 1000)
342
+
343
+ #--------------RANDOM ORDER, MANY DUPLICATES------------------
344
+ #------------------------------------------------
345
+ # size = 10,000
346
+ #------------------------------------------------
347
+ print("\nRandom Order, Many Duplicates\n---------------------------------")
348
+
349
+ w = [random.randint(0, size2//10) for a in range(0, size2)]
350
+ t1 = time.clock()
351
+ insertion_sort3(w)
352
+ print("Insertion Sort(size=", str(size2),"): ", (time.clock()-t1) * 1000)
353
+
354
+ w = [random.randint(0, size2//10) for a in range(0, size2)]
355
+ t1 = time.clock()
356
+ selection_sort(w)
357
+ print("Selection Sort(size=", str(size2),"): ", (time.clock()-t1) * 1000)
358
+
359
+ w = [random.randint(0,size2//10) for a in range(0, size2)]
360
+ t1 = time.clock()
361
+ bubble_sort2(w)
362
+ print("Bubble Sort(size=", str(size2),"): ", (time.clock()-t1) * 1000)
363
+
364
+ w = [random.randint(0, size2//10) for a in range(0, size2)]
365
+ t1 = time.clock()
366
+ merge_sort(w)
367
+ print("Merge Sort(size=", str(size2),"): ", (time.clock()-t1) * 1000)
368
+
369
+ w = [random.randint(0, size2//10) for a in range(0, size2)]
370
+ t1 = time.clock()
371
+ quick_sort(w)
372
+ print("Quick Sort(size=", str(size2),"): ", (time.clock()-t1) * 1000)
373
+
374
+ w = [random.randint(0, size2//10) for a in range(0, size2)]
375
+ t1 = time.clock()
376
+ w.sort()
377
+ print("Tim Sort(size=", str(size2),"): ", (time.clock()-t1) * 1000)
378
+ #------------------------------------------------
379
+ # size = 1,000,000
380
+ #------------------------------------------------
381
+ w = [random.randint(0, size2//10) for a in range(0, size3)]
382
+ t1 = time.clock()
383
+ merge_sort(w)
384
+ print("Merge Sort(size=", str(size3),"): ", (time.clock()-t1) * 1000)
385
+
386
+ w = [random.randint(0, size2//10) for a in range(0, size3)]
387
+ t1 = time.clock()
388
+ #quick_sort(w)
389
+ #print("Quick Sort(size=", str(size3),"): ", (time.clock()-t1) * 1000)
390
+
391
+ w = [random.randint(0, size2//10) for a in range(0, size3)]
392
+ t1 = time.clock()
393
+ w.sort()
394
+ print("Tim Sort(size=", str(size3),"): ", (time.clock()-t1) * 1000)
0 commit comments