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