Skip to content

Commit b5917ba

Browse files
committed
updated median()
1 parent b4b215c commit b5917ba

File tree

1 file changed

+20
-17
lines changed

1 file changed

+20
-17
lines changed

lib/statistics.ex

Lines changed: 20 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,6 @@ defmodule Statistics do
3939
@doc """
4040
Get the median value from a list.
4141
42-
Pass in `true` as a 2nd parameter if you know your list to be already sorted.
43-
4442
## Examples
4543
4644
iex> Statistics.median([])
@@ -52,23 +50,28 @@ defmodule Statistics do
5250
5351
"""
5452
@spec median(list) :: number
55-
def median([]), do: nil
53+
def median([]), do: nil
5654
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
7073
end
71-
74+
7275
@doc """
7376
Get the most frequently occuring value
7477

0 commit comments

Comments
 (0)