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