File tree Expand file tree Collapse file tree 1 file changed +20
-17
lines changed Expand file tree Collapse file tree 1 file changed +20
-17
lines changed Original file line number Diff line number Diff line change @@ -39,8 +39,6 @@ defmodule Statistics do
39
39
@ doc """
40
40
Get the median value from a list.
41
41
42
- Pass in `true` as a 2nd parameter if you know your list to be already sorted.
43
-
44
42
## Examples
45
43
46
44
iex> Statistics.median([])
@@ -52,23 +50,28 @@ defmodule Statistics do
52
50
53
51
"""
54
52
@ spec median ( list ) :: number
55
- def median ( [ ] ) , do: nil
53
+ def median ( [ ] ) , do: nil
56
54
def median ( list ) when is_list ( list ) do
57
- do_median list
58
- end
59
- # awkward ...
60
- defp do_median ( mlist ) do
61
- list = Enum . sort mlist
62
- middle = ( length ( list ) - 1 ) / 2
63
- do_median ( list , middle , :erlang . trunc ( middle ) )
64
- end
65
- defp do_median ( sorted_list , m , f ) when m > f do
66
- sorted_list |> Enum . slice ( f , 2 ) |> mean
67
- end
68
- defp do_median ( sorted_list , _ , f ) do
69
- sorted_list |> Enum . at ( f )
55
+ midpoint =
56
+ length ( list ) / 2
57
+ |> Float . floor
58
+ |> round
59
+
60
+ { l1 , l2 } =
61
+ Enum . sort ( list )
62
+ |> Enum . split ( midpoint )
63
+
64
+ case length ( l2 ) > length ( l1 ) do
65
+ true ->
66
+ [ med | _ ] = l2
67
+ med
68
+ false ->
69
+ [ m1 | _ ] = l2
70
+ [ m2 | _ ] = Enum . reverse ( l1 )
71
+ mean ( [ m1 , m2 ] )
72
+ end
70
73
end
71
-
74
+
72
75
@ doc """
73
76
Get the most frequently occuring value
74
77
You can’t perform that action at this time.
0 commit comments