erlang 排序算法

来源:互联网 发布:安徽之达大数据研究院 编辑:程序博客网 时间:2024/05/24 08:33
-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.
0 0
原创粉丝点击