-
Notifications
You must be signed in to change notification settings - Fork 12.4k
/
Copy pathsorting_algos.py
121 lines (100 loc) · 3.12 KB
/
sorting_algos.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
'''Contains some of the Major Sorting Algorithm'''
def selection_sort(arr : list) -> list:
'''TC : O(n^2)
SC : O(1)'''
n = len(arr)
for i in range( n):
for j in range(i+1 , n):
if arr[i] > arr[j]:
arr[i] , arr[j] = arr[j] , arr[i]
return arr
def bubble_sort(arr : list) -> list:
'''TC : O(n^2)
SC : O(1)'''
n = len(arr)
flag = True
while flag:
flag = False
for i in range(1 , n):
if arr[i-1] > arr[i]:
flag = True
arr[i-1] , arr[i] = arr[i] , arr[i-1]
return arr
def insertion_sort(arr : list) -> list:
'''TC : O(n^2)
SC : O(1)'''
n = len(arr)
for i in range(1, n):
for j in range(i , 0 , -1):
if arr[j-1] > arr[j]:
arr[j-1] , arr[j] = arr[j] , arr[j-1]
else :
break
return arr
def merge_sort(arr : list) -> list:
'''TC : O(nlogn)
SC : O(n) for this version ... But SC can be reduced to O(1)'''
n = len(arr)
if n == 1: return arr
m = len(arr) // 2
L = arr[:m]
R = arr[m:]
L = merge_sort(L)
R = merge_sort(R)
l = r = 0
sorted_arr = [0] * n
i = 0
while l < len(L) and r < len(R):
if L[l] < R[r]:
sorted_arr[i] = L[l]
l += 1
else :
sorted_arr[i] = R[r]
r += 1
i += 1
while l < len(L):
sorted_arr[i] = L[l]
l += 1
i += 1
while r < len(R):
sorted_arr[i] = R[r]
r += 1
i += 1
return arr
def quick_sort(arr : list) -> list:
'''TC : O(nlogn) (TC can be n^2 for SUUUper worst case i.e. If the Pivot is continuously bad)
SC : O(n) for this version ... But SC can be reduced to O(logn)'''
if len(arr) <= 1: return arr
piv = arr[-1]
L = [x for x in arr[:-1] if x <= piv]
R = [x for x in arr[:-1] if x > piv]
L , R = quick_sort(L) , quick_sort(L)
return L + [piv] + R
def counting_sort(arr : list) -> list:
'''This Works only for Positive int's(+ve), but can be modified for Negative's also
TC : O(n)
SC : O(n)'''
n = len(arr)
maxx = max(arr)
counts = [0] * (maxx + 1)
for x in arr:
counts[x] += 1
i = 0
for c in range(maxx + 1):
while counts[c] > 0:
arr[i] = c
i += 1
counts[c] -= 1
return arr
def main():
algos = {'selection_sort' : ['TC : O(n^2)','SC : O(1)'],
'bubble_sort' : ['TC : O(n^2)','SC : O(1)'],
'insertion_sort' : ['TC : O(n^2)','SC : O(1)'],
'merge_sort' : ['TC : O(n^2)','SC : O(1)'],
'quick_sort' : ['TC : O(n^2)','SC : O(1)'],
'counting_sort' : ['TC : O(n^2)','SC : O(1)'],}
inp = [1 , 2 ,7 , -8 , 34 , 2 , 80 , 790 , 6]
arr = counting_sort(inp)
print('U are amazing, Keep up')
if __name__ == '__main__':
main()