-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.