import random import time import copy size1 = 100 size2 = 10000 size3 = 1000000 span = 1000000 threshold = 20 #--------------------------------------- # Insertion Sort #--------------------------------------- # not optimized, equiv to while version below, but uses for loop def insertion_sort1(A): for i in range(1, len(A)): for j in range(i-1, -1, -1): if A[j] > A[j+1]: A[j], A[j+1] = A[j+1], A[j] else: break # not optimized, equiv to break version, but uses while loop def insertion_sort2(A): for i in range(1, len(A)): j = i-1 while A[j] > A[j+1] and j >= 0: A[j], A[j+1] = A[j+1], A[j] j -= 1 # optimized - shifts instead of swapping def insertion_sort3(A): for i in range(1, len(A)): curNum = A[i] k = 0 for j in range(i-1, -2, -1): k = j if A[j] > curNum: A[j+1] = A[j] else: break A[k+1] = curNum #--------------------------------------- # Selection Sort #--------------------------------------- def selection_sort(A): for i in range (0, len(A) - 1): minIndex = i for j in range (i+1, len(A)): if A[j] < A[minIndex]: minIndex = j if minIndex != i: A[i], A[minIndex] = A[minIndex], A[i] #--------------------------------------- # Bubble Sort #--------------------------------------- # not optimized def bubble_sort1(A): for i in range (0, len(A) - 1): for j in range (0, len(A) - i - 1): if A[j] > A[j+1]: A[j], A[j+1] = A[j+1], A[j] # optimized to exit if no swaps occur def bubble_sort2(A): for i in range (0, len(A) - 1): done = True for j in range (0, len(A) - i - 1): if A[j] > A[j+1]: A[j], A[j+1] = A[j+1], A[j] done = False if done: return #--------------------------------------- # Merge Sort #--------------------------------------- def merge_sort(A): merge_sort2(A, 0, len(A)-1) def merge_sort2(A, first, last): if last-first < threshold and first < last: quick_selection(A, first, last) elif first < last: middle = (first + last)//2 merge_sort2(A, first, middle) merge_sort2(A, middle+1, last) merge(A, first, middle, last) def merge(A, first, middle, last): L = A[first:middle] R = A[middle:last+1] L.append(999999999) R.append(999999999) i = j = 0 for k in range (first, last+1): if L[i] <= R[j]: A[k] = L[i] i += 1 else: A[k] = R[j] j += 1 #--------------------------------------- # Quick Sort #--------------------------------------- def quick_sort(A): quick_sort2(A, 0, len(A)-1) def quick_sort2(A, low, hi): if hi-low < threshold and low < hi: quick_selection(A, low, hi) elif low < hi: p = partition(A, low, hi) quick_sort2(A, low, p - 1) quick_sort2(A, p + 1, hi) def get_pivot(A, low, hi): mid = (hi + low) // 2 s = sorted([A[low], A[mid], A[hi]]) if s[1] == A[low]: return low elif s[1] == A[mid]: return mid return hi def partition(A, low, hi): pivotIndex = get_pivot(A, low, hi) pivotValue = A[pivotIndex] A[pivotIndex], A[low] = A[low], A[pivotIndex] border = low for i in range(low, hi+1): if A[i] < pivotValue: border += 1 A[i], A[border] = A[border], A[i] A[low], A[border] = A[border], A[low] return (border) def quick_selection(x, first, last): for i in range (first, last): minIndex = i for j in range (i+1, last+1): if x[j] < x[minIndex]: minIndex = j if minIndex != i: x[i], x[minIndex] = x[minIndex], x[i] #--------------RANDOM ORDER---------------------- #------------------------------------------------ # size = 100 #------------------------------------------------ print("\nRandom Order\n---------------------------------") w = [random.randint(0, span) for a in range(0, size1)] t1 = time.clock() insertion_sort3(w) print("Insertion Sort(size=", str(size1),"): ", (time.clock()-t1) * 1000) w = [random.randint(0, span) for a in range(0, size1)] t1 = time.clock() selection_sort(w) print("Selection Sort(size=", str(size1),"): ", (time.clock()-t1) * 1000) w = [random.randint(0, span) for a in range(0, size1)] t1 = time.clock() bubble_sort2(w) print("Bubble Sort(size=", str(size1),"): ", (time.clock()-t1) * 1000) w = [random.randint(0, span) for a in range(0, size1)] t1 = time.clock() merge_sort(w) print("Merge Sort(size=", str(size1),"): ", (time.clock()-t1) * 1000) w = [random.randint(0, span) for a in range(0, size1)] t1 = time.clock() quick_sort(w) print("Quick Sort(size=", str(size1),"): ", (time.clock()-t1) * 1000) w = [random.randint(0, span) for a in range(0, size1)] t1 = time.clock() w.sort() print("Tim Sort(size=", str(size1),"): ", (time.clock()-t1) * 1000) #------------------------------------------------ # size = 10,000 #------------------------------------------------ w = [random.randint(0, span) for a in range(0, size2)] t1 = time.clock() insertion_sort3(w) print("Insertion Sort(size=", str(size2),"): ", (time.clock()-t1) * 1000) w = [random.randint(0, span) for a in range(0, size2)] t1 = time.clock() selection_sort(w) print("Selection Sort(size=", str(size2),"): ", (time.clock()-t1) * 1000) w = [random.randint(0, span) for a in range(0, size2)] t1 = time.clock() bubble_sort2(w) print("Bubble Sort(size=", str(size2),"): ", (time.clock()-t1) * 1000) w = [random.randint(0, span) for a in range(0, size2)] t1 = time.clock() merge_sort(w) print("Merge Sort(size=", str(size2),"): ", (time.clock()-t1) * 1000) w = [random.randint(0, span) for a in range(0, size2)] t1 = time.clock() quick_sort(w) print("Quick Sort(size=", str(size2),"): ", (time.clock()-t1) * 1000) w = [random.randint(0, span) for a in range(0, size2)] t1 = time.clock() w.sort() print("Tim Sort(size=", str(size2),"): ", (time.clock()-t1) * 1000) #------------------------------------------------ # size = 1,000,000 #------------------------------------------------ w = [random.randint(0, span) for a in range(0, size3)] t1 = time.clock() merge_sort(w) print("Merge Sort(size=", str(size3),"): ", (time.clock()-t1) * 1000) w = [random.randint(0, span) for a in range(0, size3)] t1 = time.clock() quick_sort(w) print("Quick Sort(size=", str(size3),"): ", (time.clock()-t1) * 1000) w = [random.randint(0, span) for a in range(0, size3)] t1 = time.clock() w.sort() print("Tim Sort(size=", str(size3),"): ", (time.clock()-t1) * 1000) # ----------------ALREADY SORTED----------------- #------------------------------------------------ # size = 10,000 #------------------------------------------------ print("\nAlready Sorted\n---------------------------------") w = [a for a in range(0, size2)] t1 = time.clock() insertion_sort3(w) print("Insertion Sort(size=", str(size2),"): ", (time.clock()-t1) * 1000) t1 = time.clock() selection_sort(w) print("Selection Sort(size=", str(size2),"): ", (time.clock()-t1) * 1000) t1 = time.clock() bubble_sort2(w) print("Bubble Sort(size=", str(size2),"): ", (time.clock()-t1) * 1000) t1 = time.clock() merge_sort(w) print("Merge Sort(size=", str(size2),"): ", (time.clock()-t1) * 1000) t1 = time.clock() quick_sort(w) print("Quick Sort(size=", str(size2),"): ", (time.clock()-t1) * 1000) t1 = time.clock() w.sort() print("Tim Sort(size=", str(size2),"): ", (time.clock()-t1) * 1000) #------------------------------------------------ # size = 1,000,000 #------------------------------------------------ w = [a for a in range(0, size3)] t1 = time.clock() merge_sort(w) print("Merge Sort(size=", str(size3),"): ", (time.clock()-t1) * 1000) t1 = time.clock() quick_sort(w) print("Quick Sort(size=", str(size3),"): ", (time.clock()-t1) * 1000) t1 = time.clock() w.sort() print("Tim Sort(size=", str(size3),"): ", (time.clock()-t1) * 1000) # ----------------REVERSE SORTED----------------- #------------------------------------------------ # size = 10,000 #------------------------------------------------ print("\nReverse Sorted\n---------------------------------") w = [a for a in range(0, size2)] w.reverse() t1 = time.clock() insertion_sort3(w) print("Insertion Sort(size=", str(size2),"): ", (time.clock()-t1) * 1000) w = [a for a in range(0, size2)] w.reverse() t1 = time.clock() selection_sort(w) print("Selection Sort(size=", str(size2),"): ", (time.clock()-t1) * 1000) w = [a for a in range(0, size2)] w.reverse() t1 = time.clock() bubble_sort2(w) print("Bubble Sort(size=", str(size2),"): ", (time.clock()-t1) * 1000) w = [a for a in range(0, size2)] w.reverse() t1 = time.clock() merge_sort(w) print("Merge Sort(size=", str(size2),"): ", (time.clock()-t1) * 1000) w = [a for a in range(0, size2)] w.reverse() t1 = time.clock() quick_sort(w) print("Quick Sort(size=", str(size2),"): ", (time.clock()-t1) * 1000) w = [a for a in range(0, size2)] w.reverse() t1 = time.clock() w.sort() print("Tim Sort(size=", str(size2),"): ", (time.clock()-t1) * 1000) #------------------------------------------------ # size = 1,000,000 #------------------------------------------------ w = [a for a in range(0, size3)] w.reverse() t1 = time.clock() merge_sort(w) print("Merge Sort(size=", str(size3),"): ", (time.clock()-t1) * 1000) w = [a for a in range(0, size3)] w.reverse() t1 = time.clock() quick_sort(w) print("Quick Sort(size=", str(size3),"): ", (time.clock()-t1) * 1000) w = [a for a in range(0, size3)] w.reverse() t1 = time.clock() w.sort() print("Tim Sort(size=", str(size3),"): ", (time.clock()-t1) * 1000) #--------------RANDOM ORDER, MANY DUPLICATES------------------ #------------------------------------------------ # size = 10,000 #------------------------------------------------ print("\nRandom Order, Many Duplicates\n---------------------------------") w = [random.randint(0, size2//10) for a in range(0, size2)] t1 = time.clock() insertion_sort3(w) print("Insertion Sort(size=", str(size2),"): ", (time.clock()-t1) * 1000) w = [random.randint(0, size2//10) for a in range(0, size2)] t1 = time.clock() selection_sort(w) print("Selection Sort(size=", str(size2),"): ", (time.clock()-t1) * 1000) w = [random.randint(0,size2//10) for a in range(0, size2)] t1 = time.clock() bubble_sort2(w) print("Bubble Sort(size=", str(size2),"): ", (time.clock()-t1) * 1000) w = [random.randint(0, size2//10) for a in range(0, size2)] t1 = time.clock() merge_sort(w) print("Merge Sort(size=", str(size2),"): ", (time.clock()-t1) * 1000) w = [random.randint(0, size2//10) for a in range(0, size2)] t1 = time.clock() quick_sort(w) print("Quick Sort(size=", str(size2),"): ", (time.clock()-t1) * 1000) w = [random.randint(0, size2//10) for a in range(0, size2)] t1 = time.clock() w.sort() print("Tim Sort(size=", str(size2),"): ", (time.clock()-t1) * 1000) #------------------------------------------------ # size = 1,000,000 #------------------------------------------------ w = [random.randint(0, size2//10) for a in range(0, size3)] t1 = time.clock() merge_sort(w) print("Merge Sort(size=", str(size3),"): ", (time.clock()-t1) * 1000) w = [random.randint(0, size2//10) for a in range(0, size3)] t1 = time.clock() #quick_sort(w) #print("Quick Sort(size=", str(size3),"): ", (time.clock()-t1) * 1000) w = [random.randint(0, size2//10) for a in range(0, size3)] t1 = time.clock() w.sort() print("Tim Sort(size=", str(size3),"): ", (time.clock()-t1) * 1000)