@@ -12,6 +12,7 @@ def bubble_sort (array: list) -> list :
1212 swap += 1
1313 array [j ], array [j + 1 ] = array [j + 1 ], array [j ]
1414
15+ return comparison , swap
1516
1617def exchange_sort (array : list ) -> list :
1718
@@ -25,25 +26,46 @@ def exchange_sort (array: list) -> list :
2526 swap += 1
2627 array [i ], array [j ] = array [j ], array [i ]
2728
29+ return comparison , swap
2830
29- def heapify (array : list , index : int , size : int ) -> list :
31+
32+ def heapify (array : list , index : int , size : int , comparison : int , swap : int ) -> list :
3033 largest = index
3134 left = 2 * index + 1
3235 right = 2 * index + 2
3336
34- if ((size > left ) and (array [left ] > array [largest ])) : largest = left
35- if ((size > right ) and (array [right ] > array [largest ])) : largest = right
37+ if ((size > left ) and (array [left ] > array [largest ])) :
38+ comparison += 1
39+ largest = left
40+
41+ if ((size > right ) and (array [right ] > array [largest ])) :
42+ comparison += 2
43+ largest = right
44+
45+
3646 if (largest != index ) :
47+ swap += 1
3748 array [index ], array [largest ] = array [largest ], array [index ]
38- heapify (array , largest , size )
49+ comparison , swap = heapify (array , largest , size , comparison , swap )
50+
51+ return comparison , swap
3952
4053def heap_sort (array : list ) -> list :
4154
4255 n = len (array )
43- for index in range (n // 2 - 1 , - 1 , - 1 ) : heapify (array , index , n )
56+ comparison , swap = 0 , 0
57+
58+ for index in range (n // 2 - 1 , - 1 , - 1 ) :
59+ a , b = heapify (array , index , n , comparison , swap )
60+ comparison , swap = comparison + a , swap + b
61+
4462 for index in range (n - 1 , 0 , - 1 ) :
63+ swap += 1
4564 array [0 ], array [index ] = array [index ], array [0 ]
46- heapify (array , 0 , index )
65+ a , b = heapify (array , 0 , index , comparison , swap )
66+ comparison , swap = comparison + a , swap + b
67+
68+ return comparison , swap
4769
4870
4971def insertion_sort (array : list ) -> list :
@@ -60,6 +82,7 @@ def insertion_sort (array: list) -> list :
6082
6183 else : break
6284
85+ return comparison , swap
6386
6487def merge_sort (array : list ) -> list :
6588
@@ -72,9 +95,13 @@ def merge_sort (array: list) -> list :
7295 left = array [ : m ]
7396 right = array [m : ]
7497
75- comparison , swap = merge_sort (left )
76- comparison , swap = merge_sort (right )
77- merge (m , n - m , left , right , array , comparison , swap )
98+ a , b = merge_sort (left )
99+ comparison , swap = comparison + a , swap + b
100+ a , b = merge_sort (right )
101+ comparison , swap = comparison + a , swap + b
102+ comparison , swap = merge (m , n - m , left , right , array , comparison , swap )
103+
104+ return comparison , swap
78105
79106def merge (l , r , left , right , array ,comparison : int , swap : int ) :
80107
@@ -99,7 +126,7 @@ def merge (l, r, left, right, array,comparison: int, swap: int) :
99126 array [k ] = right [j ]
100127 j += 1
101128 k += 1
102-
129+ return
103130
104131def quick_sort (array : list ) -> list :
105132
@@ -123,3 +150,39 @@ def partition (array: list, low: int, high: int) -> int :
123150 array [i ], array [j ] = array [j ], array [i ]
124151 array [j ], array [low ] = array [low ], array [j ]
125152 return j
153+
154+
155+ def selection_sort (array : list ) -> list :
156+
157+ n = len (array )
158+ comparison , swap = 0 , 0
159+
160+ for i in range (n ) :
161+ min_index = i
162+
163+ for j in range (i + 1 , n ) :
164+ comparison += 1
165+ if (array [min_index ] > array [j ]) :
166+ min_index = j
167+
168+ swap += 1
169+ array [i ], array [min_index ] = array [min_index ], array [i ]
170+
171+ return comparison , swap
172+
173+ if (__name__ == "__main__" ) :
174+
175+ '''
176+ bubble_sort
177+ exchange_sort
178+ heap_sort
179+ insertion_sort
180+ merge_sort
181+ quick_sort
182+ selection_sort
183+ '''
184+ array = [5 , 4 , 3 , 2 , 1 ]
185+ a , b = heap_sort (array )
186+
187+ print (array )
188+ print (a , b )
0 commit comments