19
19
5
20
20
"""
21
21
22
- def median_of_five (arr :list ) -> int :
22
+
23
+ def median_of_five (arr : list ) -> int :
23
24
"""
24
25
>>> median_of_five([2, 4, 5, 7, 899])
25
26
5
@@ -35,27 +36,32 @@ def median_of_five(arr:list) -> int:
35
36
:param arr: Array to find median of
36
37
:return: median of arr
37
38
"""
38
- arr = sorted (arr )
39
- return arr [len (arr )// 2 ]
39
+ arr = sorted (arr )
40
+ return arr [len (arr ) // 2 ]
41
+
40
42
41
- def median_of_medians (arr :list ) -> int :
43
+ def median_of_medians (arr : list ) -> int :
42
44
"""
43
45
Return a pivot to partition data on by calculating
44
46
Median of medians of input data
45
47
:param arr: The data to be sorted (a list)
46
48
:param k: The rank to be searched
47
49
:return: element at rank k
48
50
"""
49
- if len (arr ) <= 5 : return median_of_five (arr )
51
+ if len (arr ) <= 5 :
52
+ return median_of_five (arr )
50
53
medians = []
51
- i = 0
52
- while i < len (arr ):
53
- if (i + 4 ) <= len (arr ): medians .append (median_of_five (arr [i :].copy ()))
54
- else : medians .append (median_of_five (arr [i :i + 5 ].copy ()))
55
- i += 5
54
+ i = 0
55
+ while i < len (arr ):
56
+ if (i + 4 ) <= len (arr ):
57
+ medians .append (median_of_five (arr [i :].copy ()))
58
+ else :
59
+ medians .append (median_of_five (arr [i : i + 5 ].copy ()))
60
+ i += 5
56
61
return median_of_medians (medians )
57
62
58
- def quick_select (arr :list , k :int ) -> int :
63
+
64
+ def quick_select (arr : list , k : int ) -> int :
59
65
"""
60
66
>>> quick_select([2, 4, 5, 7, 899, 54, 32], 5)
61
67
32
@@ -76,7 +82,7 @@ def quick_select(arr:list, k:int) -> int:
76
82
"""
77
83
78
84
# Invalid Input
79
- if k > len (arr ):
85
+ if k > len (arr ):
80
86
return - 1
81
87
82
88
# x is the estimated pivot by median of medians algorithm
@@ -94,7 +100,10 @@ def quick_select(arr:list, k:int) -> int:
94
100
else :
95
101
right .append (arr [i ])
96
102
rank_X = len (left ) + 1
97
- if (rank_X == k ): answer = x
98
- elif rank_X > k : answer = quick_select (left ,k )
99
- elif rank_X < k : answer = quick_select (right ,k - rank_X )
100
- return answer ;
103
+ if rank_X == k :
104
+ 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 )
109
+ return answer
0 commit comments