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