erlang 排序算法

来源:互联网 发布:python前景和待遇 编辑:程序博客网 时间:2024/05/04 20:12

快速排序:拿一个数出来做基准,小放左,大放右

sort([]) -> [];sort([H|T]) -> sort([X||X<-T,X<H]) ++ [H] ++ sort([X||X<-T,X>=H]).


插入排序:维护一个有序列和无序列,假定这个数组的序是排好的,然后从头往后,如果有数比当前外层元素的值大,则将这个数的位置往后挪,直到当前外层元素的值大于或等于它前面的位置为止.这具算法在排完前k个数之后,可以保证a[1…k]是局部有序的,保证了插入过程的正确性.

sort([]) -> [];sort([H|T]) -> sort([H],T,[]).sort(A,[],[]) -> A;sort(A,[],B) -> B++A;sort([],[B1|B2],N) -> sort(N++[B1],B2,[]);sort([A1|A2],[B1|B2],N) ->    if        A1<B1  -> sort(A2,[B1|B2],N++[A1]);        A1>=B1 -> sort ([B1,A1|A2],B2,N)    end.


归并排序:归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。值得注意的是归并排序是一种稳定的排序方法。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序,称为2-路归并。

-module(sort_gb).-compile(export_all).sort([]) -> [];sort([A]) -> [A];sort(L) ->    {L1,L2} = lists:split(length(L) div 2,L),    sort(sort(L1),sort(L2)).sort([],L) -> L;sort(L,[]) -> L;sort([H1|T1],[H2|T2]) ->    if        H1 =< H2 -> [H1|sort(T1,[H2|T2])];        H1 >  H2 -> [H2|sort([H1|T1],T2)]    end.


堆排序:就实现一个完全二叉树,loop(取树根,调整树结构)。可选大根堆和小根堆的实现方式。

https://github.com/daqing/algorithms/blob/master/heap_sort/heap_sort.erl