6
6
https://en.wikipedia.org/wiki/Median_of_medians
7
7
"""
8
8
9
- def MedianofFive (arr :list ) -> int :
9
+
10
+ def MedianofFive (arr : list ) -> int :
10
11
"""
11
12
Return the median of the input list
12
13
:param arr: Array to find median of
13
14
:return: median of arr
14
15
"""
15
- arr = sorted (arr )
16
- return arr [len (arr )// 2 ]
16
+ arr = sorted (arr )
17
+ return arr [len (arr ) // 2 ]
18
+
17
19
18
- def MedianofMedians (arr :list ) -> int :
20
+ def MedianofMedians (arr : list ) -> int :
19
21
"""
20
22
Return a pivot to partition data on by calculating
21
23
Median of medians of input data
22
24
:param arr: The data to be sorted (a list)
23
25
:param k: The rank to be searched
24
26
:return: element at rank k
25
27
"""
26
- if len (arr ) <= 5 : return MedianofFive (arr )
28
+ if len (arr ) <= 5 :
29
+ return MedianofFive (arr )
27
30
medians = []
28
- i = 0
29
- while i < len (arr ):
30
- if (i + 4 ) <= len (arr ): medians .append (MedianofFive (arr [i :].copy ()))
31
- else : medians .append (MedianofFive (arr [i :i + 5 ].copy ()))
32
- i += 5
31
+ i = 0
32
+ while i < len (arr ):
33
+ if (i + 4 ) <= len (arr ):
34
+ medians .append (MedianofFive (arr [i :].copy ()))
35
+ else :
36
+ medians .append (MedianofFive (arr [i : i + 5 ].copy ()))
37
+ i += 5
33
38
return MedianofMedians (medians )
34
39
35
- def QuickSelect (arr :list , k :int ) -> int :
40
+
41
+ def QuickSelect (arr : list , k : int ) -> int :
36
42
"""
37
43
>>> QuickSelect([2, 4, 5, 7, 899, 54, 32], 5)
38
44
32
@@ -53,7 +59,7 @@ def QuickSelect(arr:list, k:int) -> int:
53
59
"""
54
60
55
61
# Invalid Input
56
- if k > len (arr ):
62
+ if k > len (arr ):
57
63
return None
58
64
59
65
# x is the estimated pivot by median of medians algorithm
@@ -72,7 +78,10 @@ def QuickSelect(arr:list, k:int) -> int:
72
78
else :
73
79
right .append (arr [i ])
74
80
rankX = len (left ) + 1
75
- if (rankX == k ): answer = x
76
- elif rankX > k : answer = QuickSelect (left ,k )
77
- elif rankX < k : answer = QuickSelect (right ,k - rankX )
78
- return answer ;
81
+ if rankX == k :
82
+ answer = x
83
+ elif rankX > k :
84
+ answer = QuickSelect (left , k )
85
+ elif rankX < k :
86
+ answer = QuickSelect (right , k - rankX )
87
+ return answer
0 commit comments