erlang 排序算法

-module(sort).
-author("Administrator").

%%API
-export([buddle/2,selection/1,quick/1,insert/1,merge/1,bubbles/1]).

%% 冒泡算法:每次step得到一个最大值,对余下的列表再进行递归调用
buddle([], SortedList) -> SortedList;
buddle(List, SortedList) -> {Max, T} = step(List), buddle(T, [Max] ++ SortedList).
 %% 将列表的第一个元素作为最大值与列表中的其它元素进行比较
step([H|T]) -> step(H, T, []).
step(Max, [], T1) -> {Max, T1};%% 得到最大值
step(Max, [H|T], T1) ->
     if
       Max >= H -> step(Max, T, [H] ++ T1);
       Max < H -> step(H, T, [Max] ++ T1)
     end.
%%冒泡排序
%%假如list的长度为n,则冒泡排序的执行过程是,对list遍历n-1次,每次将最大/小的一个挪到list的末尾
%%buddle([]) -> [];
%%buddle([Item]) -> [Item];
%%buddle(L) -> buddle(L,length(L)-1).
%%
%%buddle(L,0) -> L;
%%buddle(L,Time) when Time>0 ->
%%  Tmp = buddle_helper(L,[]),
%%  io:format("====~p~n",[Tmp]),
%%  buddle(Tmp,Time-1).
%%buddle_helper([],R) -> [R];
%%buddle_helper([A],R) -> [A|R];
%%buddle_helper([A,B|C],R) when A>=B -> buddle_helper([A|C],[B|R]) ;
%%buddle_helper([A,B|C],R) when A<B -> buddle_helper([B|C],[A|R]).

%%选择排序
%%每一次遍历选择出list中最大/小的一个值,然后将这个值插入返回的list中,然后对剩余的值进行下一次遍历
selection([]) -> [];
selection([Item]) -> [Item];
selection(L) -> selection(L,[]).
selection([Item],R) -> [Item|R];
selection([H|T],R) ->
  {C,Rr} = selection_helper(T,H,[]),
  selection(Rr,[C|R]).

selection_helper([],C,R) -> {C,R};
selection_helper([H|T],C,R) when H<C -> selection_helper(T,H,[C|R]);
selection_helper([H|T],C,R) when H>=C -> selection_helper(T,C,[H|R]).


%%快速排序1
%%拿一个数出来做基准,小放左,大放右
quick([]) ->[];
quick([H|T]) -> quick(T,H,[],[]).
quick([H|T],Z,L,R) when H>Z -> quick(T,Z,L,[H|R]);
quick([H|T],Z,L,R) when H=<Z -> quick(T,Z,[H|L],R);
quick([],Z,L,R) ->
  T1=quick(L),
  T2=quick(R),
  T1+[z]+T2.

%%快速排序2
%%quick([]) -> [];%%quick([H|T]) -> quick([X||X<-T,X<H]) ++ [H] ++ quick([X||X<-T,X>=H]).%%插入排序:维护一个有序列和无序列,假定这个数组的序是排好的,然后从头往后,如果有数比当前外层元素的值大,则将这个数的位置往后挪,直到当前外层元素的值大于或等于它前面的位置为止.这具算法在排完前k个数之后,可以保证a[1…k]是局部有序的,保证了插入过程的正确性.insert([]) -> [];insert([H|T]) -> insert([H],T,[]).insert(A,[],[]) -> A;insert(A,[],B) -> B++A;insert([],[B1|B2],N) -> insert(N++[B1],B2,[]);insert([A1|A2],[B1|B2],N) -> if A1<B1 -> insert(A2,[B1|B2],N++[A1]); A1>=B1 -> insert ([B1,A1|A2],B2,N) end.%%归并排序:归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法%%(Divideand Conquer)的一个非常典型的应用。值得注意的是归并排序是一种稳定的排序方法。将已有序的子序列合并,得到完全有序的序列;%%即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为2-路归并。merge([]) -> [];merge([A]) -> [A];merge(L) -> {L1,L2} = lists:split(length(L) div 2,L), merge(merge(L1),merge(L2)).merge([],L) -> L;merge(L,[]) -> L;merge([H1|T1],[H2|T2]) -> if H1 =< H2 -> [H1|merge(T1,[H2|T2])]; H1 > H2 -> [H2|merge([H1|T1],T2)] end.%%堆排序:就实现一个完全二叉树,loop(取树根,调整树结构)。可选大根堆和小根堆的实现方式。%%双向冒泡排序bubbles([]) -> [];bubbles(List) -> bubbles(List, [], [], length(List)-1, 0).bubbles([X], Temp, Final, Count, Swapped) -> case Swapped == Count of true -> lists:append(lists:reverse(Final), [X|Temp]); _ -> bubbles(Temp, [], [X|Final], Count-1, 0) end;bubbles([X,Y|Z], Temp, _Final, _Count, Swapped) -> case X > Y of true -> bubbles([Y|Z], [X|Temp], _Final, _Count, Swapped+1); _ -> bubbles([X|Z], [Y|Temp], _Final, _Count, Swapped) end.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值