Skip to content

Commit e807cc4

Browse files
committed
First Release
5 sorting algorithms in Python, first release on 6/14/2015.
1 parent 03dcecd commit e807cc4

File tree

1 file changed

+396
-0
lines changed

1 file changed

+396
-0
lines changed

python_sorting.py

Lines changed: 396 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,396 @@
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("\nRandom 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("\nAlready 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("\nReverse 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("\nRandom 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

Comments
 (0)