19195
2020"""
2121
22-
23- def median_of_five (arr : list ) -> int :
22+ def median_of_five (arr :list ) -> int :
2423 """
2524 >>> median_of_five([2, 4, 5, 7, 899])
2625 5
@@ -36,32 +35,39 @@ def median_of_five(arr: list) -> int:
3635 :param arr: Array to find median of
3736 :return: median of arr
3837 """
39- arr = sorted (arr )
40- return arr [len (arr ) // 2 ]
41-
38+ arr = sorted (arr )
39+ return arr [len (arr )// 2 ]
4240
43- def median_of_medians (arr : list ) -> int :
41+ def median_of_medians (arr :list ) -> int :
42+ """
43+ >>> median_of_medians([2, 4, 5, 7, 899, 54, 32])
44+ 54
45+ >>> median_of_medians([5, 7, 899, 54, 32])
46+ 32
47+ >>> median_of_medians([5, 4, 3, 2])
48+ 4
49+ >>> median_of_medians([3, 5, 7, 10, 2, 12])
50+ 12
51+ """
4452 """
4553 Return a pivot to partition data on by calculating
4654 Median of medians of input data
47- :param arr: The data to be sorted (a list)
48- :param k: The rank to be searched
49- :return: element at rank k
55+ :param arr: The data to be checked (a list)
56+ :return: median of medians of input array
5057 """
5158 if len (arr ) <= 5 :
5259 return median_of_five (arr )
5360 medians = []
54- i = 0
55- while i < len (arr ):
61+ i = 0
62+ while i < len (arr ):
5663 if (i + 4 ) <= len (arr ):
5764 medians .append (median_of_five (arr [i :].copy ()))
5865 else :
59- medians .append (median_of_five (arr [i : i + 5 ].copy ()))
60- i += 5
66+ medians .append (median_of_five (arr [i : i + 5 ].copy ()))
67+ i += 5
6168 return median_of_medians (medians )
6269
63-
64- def quick_select (arr : list , k : int ) -> int :
70+ def quick_select (arr :list , target :int ) -> int :
6571 """
6672 >>> quick_select([2, 4, 5, 7, 899, 54, 32], 5)
6773 32
@@ -76,13 +82,13 @@ def quick_select(arr: list, k: int) -> int:
7682 """
7783 Two way partition the data into smaller and greater lists,
7884 in relationship to the pivot
79- :param arr: The data to be sorted (a list)
80- :param k : The rank to be searched
81- :return: element at rank k
85+ :param arr: The data to be searched (a list)
86+ :param target : The rank to be searched
87+ :return: element at rank target
8288 """
8389
8490 # Invalid Input
85- if k > len (arr ):
91+ if target > len (arr ):
8692 return - 1
8793
8894 # x is the estimated pivot by median of medians algorithm
@@ -99,11 +105,11 @@ def quick_select(arr: list, k: int) -> int:
99105 check = True
100106 else :
101107 right .append (arr [i ])
102- rank_X = len (left ) + 1
103- if rank_X == k :
108+ rank_x = len (left ) + 1
109+ if ( rank_x == target ) :
104110 answer = x
105- elif rank_X > k :
106- answer = quick_select (left , k )
107- elif rank_X < k :
108- answer = quick_select (right , k - rank_X )
111+ elif rank_x > target :
112+ answer = quick_select (left ,target )
113+ elif rank_x < target :
114+ answer = quick_select (right ,target - rank_x )
109115 return answer
0 commit comments