|  | 
|  | 1 | +""" | 
|  | 2 | +about: | 
|  | 3 | +This code was written by Mostafa El-Marzouki @iSuperMostafa | 
|  | 4 | +------------------------------------------------------------ | 
|  | 5 | +summery: | 
|  | 6 | +this project is a performance comparison among bunch of sorting algorithms | 
|  | 7 | +it computes the time used in each algorithm to sort list of: Sorted numbers | 
|  | 8 | +and Unsorted numbers | 
|  | 9 | +input: the size of the numbers list | 
|  | 10 | +output: the time each algorithm take to sort the numbers in ms | 
|  | 11 | +""" | 
|  | 12 | +import random | 
|  | 13 | + | 
|  | 14 | + | 
|  | 15 | +class SortingAlgorithms: | 
|  | 16 | + # Time Complexity of Bubble Sort: | 
|  | 17 | + # Best: O(n^2), Average: O(n^2), Worst: O(n^2) | 
|  | 18 | + def BubbleSort(self, Numbers): | 
|  | 19 | + for i in range(len(Numbers)): | 
|  | 20 | + for j in range(len(Numbers)-1, i, -1): | 
|  | 21 | + if (Numbers[j] < Numbers[j-1]): | 
|  | 22 | + Numbers[j], Numbers[j - 1] = Numbers[j - 1], Numbers[j] | 
|  | 23 | + | 
|  | 24 | + # Time Complexity of Selection Sort: | 
|  | 25 | + # Best: O(n^2), Average: O(n^2), Worst: O(n^2) | 
|  | 26 | + def SelectionSort(self, Numbers): | 
|  | 27 | + for i in range(len(Numbers)): | 
|  | 28 | + Min = i | 
|  | 29 | + for j in range(i+1, len(Numbers)): | 
|  | 30 | + if Numbers[j] < Numbers[Min]: | 
|  | 31 | + Min = j | 
|  | 32 | + Numbers[i], Numbers[Min] = Numbers[Min], Numbers[i] | 
|  | 33 | + | 
|  | 34 | + # Time Complexity of Insertion Sort: | 
|  | 35 | + # Best: O(n), Average: O(n^2), Worst: O(n^2) | 
|  | 36 | + def InsertionSort(self, Numbers): | 
|  | 37 | + for i in range(len(Numbers)): | 
|  | 38 | + Temp = Numbers[i] | 
|  | 39 | + j = i | 
|  | 40 | + while j > 0 and Temp < Numbers[j-1]: | 
|  | 41 | + Numbers[j] = Numbers[j-1] | 
|  | 42 | + j -= 1 | 
|  | 43 | + Numbers[j] = Temp | 
|  | 44 | + | 
|  | 45 | + # Time Complexity of Shell Sort: | 
|  | 46 | + # Best: O(n), Average: O(n),Worst: O(n^2) | 
|  | 47 | + def ShellSort(self, Numbers): | 
|  | 48 | + Gap = len(Numbers)//2 | 
|  | 49 | + while Gap: | 
|  | 50 | + for i in range(len(Numbers)): | 
|  | 51 | + j = i | 
|  | 52 | + Temp = Numbers[i] | 
|  | 53 | + while j >= Gap and Numbers[j-Gap] > Temp: | 
|  | 54 | + Numbers[j] = Numbers[j-Gap] | 
|  | 55 | + j -= Gap | 
|  | 56 | + Numbers[j] = Temp | 
|  | 57 | + Gap = Gap // 2 if Gap // 2 else (0 if Gap == 1 else 1) | 
|  | 58 | + | 
|  | 59 | + # Time Complexity of Merge Sort: O(nlog(n)) | 
|  | 60 | + def MergeSort(self, Numbers): | 
|  | 61 | + if len(Numbers) > 1: | 
|  | 62 | + Center = len(Numbers)//2 | 
|  | 63 | + LeftHandSide = Numbers[:Center] | 
|  | 64 | + RightHandSide = Numbers[Center:] | 
|  | 65 | + self.MergeSort(LeftHandSide) | 
|  | 66 | + self.MergeSort(RightHandSide) | 
|  | 67 | + i = 0 | 
|  | 68 | + j = 0 | 
|  | 69 | + k = 0 | 
|  | 70 | + while i < len(LeftHandSide) and j < len(RightHandSide): | 
|  | 71 | + if LeftHandSide[i] < RightHandSide[j]: | 
|  | 72 | + Numbers[k] = LeftHandSide[i] | 
|  | 73 | + i = i + 1 | 
|  | 74 | + else: | 
|  | 75 | + Numbers[k] = RightHandSide[j] | 
|  | 76 | + j = j + 1 | 
|  | 77 | + k = k + 1 | 
|  | 78 | + while i < len(LeftHandSide): | 
|  | 79 | + Numbers[k] = LeftHandSide[i] | 
|  | 80 | + i = i + 1 | 
|  | 81 | + k = k + 1 | 
|  | 82 | + while j < len(RightHandSide): | 
|  | 83 | + Numbers[k] = RightHandSide[j] | 
|  | 84 | + j = j + 1 | 
|  | 85 | + k = k + 1 | 
|  | 86 | + | 
|  | 87 | + # Time Complexity of Quick Sort: | 
|  | 88 | + # Best: O(nlog(n)), Average: O(nlog(n)), Worst: O(n^2) | 
|  | 89 | + def Partition(self, Values, LeftHandSide, RightHandSide): | 
|  | 90 | + def partition(Values, LeftHandSide, RightHandSide, PivotIndex): | 
|  | 91 | + pivot = Values[PivotIndex] | 
|  | 92 | + Values[RightHandSide], Values[PivotIndex] = Values[PivotIndex], Values[RightHandSide] | 
|  | 93 | + storeidx = LeftHandSide | 
|  | 94 | + for idx in range(LeftHandSide, RightHandSide): | 
|  | 95 | + if Values[idx] < pivot: | 
|  | 96 | + Values[idx], Values[storeidx] = Values[storeidx], Values[idx] | 
|  | 97 | + storeidx += 1 | 
|  | 98 | + Values[storeidx], Values[RightHandSide] = Values[RightHandSide], Values[storeidx] | 
|  | 99 | + return storeidx | 
|  | 100 | + if RightHandSide > LeftHandSide: | 
|  | 101 | + PivotIndex = random.randint(LeftHandSide, RightHandSide) | 
|  | 102 | + PivotIndex = partition(Values, LeftHandSide, RightHandSide, PivotIndex) | 
|  | 103 | + self.Partition(Values, LeftHandSide, PivotIndex) | 
|  | 104 | + self.Partition(Values, PivotIndex + 1, RightHandSide) | 
|  | 105 | + return Values | 
|  | 106 | + | 
|  | 107 | + def QuickSort(self, Numbers): | 
|  | 108 | + return self.Partition(Numbers, 0, len(Numbers) - 1) | 
0 commit comments