Anonymous user
Averages/Median: Difference between revisions
→{{header|Erlang}}: bug fix
(→{{header|Erlang}}: Refactor) |
(→{{header|Erlang}}: bug fix) |
||
Line 1,302:
qs_median([]) -> error;
qs_median([P|
TargetPos = length(List)/2 + 0.5,
qs_median(List, TargetPos, P, undefined).
qs_median([X],
qs_median([P|Tail], TargetPos, P, up) when TargetPos
qs_median(Tail, TargetPos - 1, P, up);
qs_median([P|Tail], TargetPos,
Smaller = [X || X <- Tail, X < P],
LS = length(Smaller),
qs_continue(P, LS, TargetPos, LastP, Smaller, Tail).
case (LS + 1) == TargetPos of▼
true -> P;▼
qs_continue(P, LS, TargetPos, _, _, _) when LS + 1 == TargetPos -> P;
qs_continue(P, 0, TargetPos, LastP, _SM, _TL) when TargetPos == 0.5 ->
(P+LastP)/2;
qs_continue(P, LS, TargetPos, _LastP, SM, _TL) when TargetPos == LS + 0.5 ->
qs_continue(P, LS, TargetPos, _LastP, SM, _TL) when LS + 1 > TargetPos andalso LS /= 0 ->
qs_continue(P, LS, TargetPos, _LastP, _SM, TL) ->
NewPos= TargetPos - LS -1,
(P + qs_median(Larger, 1, P, up))/2;
false ->
▲ true -> qs_median(Smaller,TargetPos, P, undefined);
▲ Larger = [X || X <- Tail, X >= P],
▲ qs_median(Larger, TargetPos - LS - 1, P, up)
end.
</lang>
|