19
19
5
20
20
"""
21
21
22
-
23
- def median_of_five (arr : list ) -> int :
22
+ def median_of_five (arr :list ) -> int :
24
23
"""
25
24
>>> median_of_five([2, 4, 5, 7, 899])
26
25
5
@@ -36,32 +35,39 @@ def median_of_five(arr: list) -> int:
36
35
:param arr: Array to find median of
37
36
:return: median of arr
38
37
"""
39
- arr = sorted (arr )
40
- return arr [len (arr ) // 2 ]
41
-
38
+ arr = sorted (arr )
39
+ return arr [len (arr )// 2 ]
42
40
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
+ """
44
52
"""
45
53
Return a pivot to partition data on by calculating
46
54
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
50
57
"""
51
58
if len (arr ) <= 5 :
52
59
return median_of_five (arr )
53
60
medians = []
54
- i = 0
55
- while i < len (arr ):
61
+ i = 0
62
+ while i < len (arr ):
56
63
if (i + 4 ) <= len (arr ):
57
64
medians .append (median_of_five (arr [i :].copy ()))
58
65
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
61
68
return median_of_medians (medians )
62
69
63
-
64
- def quick_select (arr : list , k : int ) -> int :
70
+ def quick_select (arr :list , target :int ) -> int :
65
71
"""
66
72
>>> quick_select([2, 4, 5, 7, 899, 54, 32], 5)
67
73
32
@@ -76,13 +82,13 @@ def quick_select(arr: list, k: int) -> int:
76
82
"""
77
83
Two way partition the data into smaller and greater lists,
78
84
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
82
88
"""
83
89
84
90
# Invalid Input
85
- if k > len (arr ):
91
+ if target > len (arr ):
86
92
return - 1
87
93
88
94
# x is the estimated pivot by median of medians algorithm
@@ -99,11 +105,11 @@ def quick_select(arr: list, k: int) -> int:
99
105
check = True
100
106
else :
101
107
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 ) :
104
110
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 )
109
115
return answer
0 commit comments