Averages/Median: Difference between revisions

Content added Content deleted
(→‎{{header|Erlang}}: make quick sort tail recursive)
Line 1,301: Line 1,301:


qs_median([]) -> error;
qs_median([]) -> error;
qs_median([X]) -> X;
qs_median([P|_Tail] = List) ->
qs_median([P|_Tail] = List) ->
TargetPos = length(List)/2 + 0.5,
TargetPos = length(List)/2 + 0.5,
qs_median(List, TargetPos, P, undefined,0).
qs_median(List, TargetPos, P, 0).
qs_median([X], 1, _, _, 0) -> X;
qs_median([X], 1, _, 0) -> X;
qs_median([X], 1, _, _, Acc) -> (X + Acc)/2;
qs_median([X], 1, _, Acc) -> (X + Acc)/2;
qs_median([P|Tail], TargetPos, LastP, Acc) ->

qs_median([P|Tail], TargetPos, P, up, Acc) when TargetPos > 1 ->
qs_median(Tail, TargetPos - 1, P, up, Acc);
qs_median([P|Tail], TargetPos, LastP, _, Acc) ->
Smaller = [X || X <- Tail, X < P],
Smaller = [X || X <- Tail, X < P],
LS = length(Smaller),
LS = length(Smaller),
Line 1,321: Line 1,318:
(P+LastP)/2;
(P+LastP)/2;
qs_continue(P, LS, TargetPos, _LastP, SM, _TL, _Acc) when TargetPos == LS + 0.5 ->
qs_continue(P, LS, TargetPos, _LastP, SM, _TL, _Acc) when TargetPos == LS + 0.5 ->
qs_median(SM, TargetPos - 0.5, P, undefined, P);
qs_median(SM, TargetPos - 0.5, P, P);
qs_continue(P, LS, TargetPos, _LastP, SM, _TL, Acc) when LS + 1 > TargetPos andalso LS /= 0 ->
qs_continue(P, LS, TargetPos, _LastP, SM, _TL, Acc) when LS + 1 > TargetPos ->
qs_median(SM, TargetPos, P, undefined, Acc);
qs_median(SM, TargetPos, P, Acc);
qs_continue(P, LS, TargetPos, _LastP, _SM, TL, Acc) ->
qs_continue(P, LS, TargetPos, _LastP, _SM, TL, Acc) ->
Larger = [X || X <- TL, X >= P],
Larger = [X || X <- TL, X >= P],
Line 1,329: Line 1,326:
case NewPos == 0.5 of
case NewPos == 0.5 of
true ->
true ->
qs_median(Larger, 1, P, up, P);
qs_median(Larger, 1, P, P);
false ->
false ->
qs_median(Larger, NewPos, P, up, Acc)
qs_median(Larger, NewPos, P, Acc)
end.
end.