Jump to content

Averages/Median: Difference between revisions

Line 1,302:
qs_median([]) -> error;
qs_median([P|List_Tail] = List) ->
TargetPos = length(List)/2 + 0.5,
qs_median(List, TargetPos, P, undefined).
qs_median([X], _1, _, _) -> X;
 
qs_median([X,Y], 1.5, _, _) -> (X+Y)/2;
qs_median([P|Tail], TargetPos, P, up) when TargetPos /=> 1 ->
qs_median(Tail, TargetPos - 1, P, up);
qs_median([P|Tail], TargetPos, _LastP, _) ->
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 ->
(P + qs_median(LargerSM, TargetPos - LS - 10.5, P, upundefined))/2;
qs_continue(P, LS, TargetPos, _LastP, SM, _TL) when LS + 1 > TargetPos andalso LS /= 0 ->
true -> qs_median(SmallerSM, TargetPos, P, undefined);
qs_continue(P, LS, TargetPos, _LastP, _SM, TL) ->
Larger = [X || X <- TailTL, X >= P],
NewPos= TargetPos - LS -1,
case (LS + 1)NewPos == TargetPos0.5 of
true -> P;
(P + qs_median(Larger, 1, P, up))/2;
false ->
caseqs_median(Larger, LSNewPos, +P, 1 > TargetPos ofup)
true -> qs_median(Smaller,TargetPos, P, undefined);
false ->
Larger = [X || X <- Tail, X >= P],
qs_median(Larger, TargetPos - LS - 1, P, up)
end
end.
</lang>
Anonymous user
Cookies help us deliver our services. By using our services, you agree to our use of cookies.