-module(sort_test).
-compile(export_all).
% 每次step得到一个最小值,对余下的列表再进行递归调用
sort([], SortedList) -> SortedList;
sort(List, SortedList) ->
{Min, T} = step(List),
sort(T, SortedList ++ [Min]).
% 将列表的第一个元素作为最小值与列表中的其它元素进行比较
step([H|T]) -> step(H, T, []).
step(Min, [], T1) -> {Min, T1};%% 得到最小值
step(Min, [H|T], T1) ->
if
Min < H -> step(Min, T, [H] ++ T1);
Min >= H -> step(H, T, [Min] ++ T1)
end.
selection([]) -> [];%当输入列表为空
selection([Item]) -> [Item];
selection(L) -> selection(L,[]).% -> selection([H|T],R)
selection([Item],R) -> [Item|R]; % ->selection([Item])
selection([H|T],R) -> %% ->selection([Item],R)
{C,Rr} = selection_helper(T,H,[]),%调用selection_helper方法,将列表匹配为H开头,T结尾,第三个参数为空列表(将不是最小的值统统塞到这里),然后匹配到左侧,最小值为C,余下还需重新调用selection的列表做循环的是Rr
selection(Rr,[C|R]).%循环 -> 将Rr放到开头匹配成[H|T],将最小值C放入R列表,匹配成R
selection_helper([],C,R) -> {C,R};%当列表为空时,外面的值就是最大的,R中的值未排序
selection_helper([H|T],C,R) when H>C -> selection_helper(T,H,[C|R]);%当[H|T]中的H大于C 那么将H放到外面,C放R头部
selection_helper([H|T],C,R) when H=<C -> selection_helper(T,C,[H|R]).%当[H|T]中的H小于等于C 那么将C放到外面,H放R头部, 最终保证外面的一定是列表中最大的值
网友评论