Вот одна версия:
-module(selection).
-export([selection/1]).
selection([]) -> [];
selection([H|T]) ->
{Min, Rest} = remove_min(H, T, []),
[Min | selection(Rest)].
remove_min(Min, [], Rest) -> {Min, Rest};
remove_min(SoFar, [H|T], Acc) when H < SoFar ->
remove_min(H, T, [SoFar|Acc]);
remove_min(Min, [H|T], Acc) -> remove_min(Min, T, [H|Acc]).
Или получить максимум как Ваш аргумент действителен указано с аккумулятором, но без обратного:
selection([H|T]) -> selection(T,H,[],[]).
selection([],Max,[H|T],Acc) -> selection(T,H,[],[Max|Acc]);
selection([],Max,[],Acc) -> [Max|Acc];
selection([H|T],Max,Rest,Acc) when H > Max -> selection(T,H,[Max|Rest],Acc);
selection([H|T],Max,Rest,Acc) -> selection(T,Max,[H|Rest],Acc).
Кажется, у обоих почти одинаковая производительность.